nocow上的分析,发现这规律的人实在是太厉害了,bfs或者dfs还没试过,照着这思路写最后还是有点问题,1,2时有点特殊,看了下别人的代码过了
Usaco在这题上并没有指明不可以用分析法,而且dfs肯定TLE,所以我们取巧。
先观察样例数据,如果把还没移动的那一步也算上,那么空格的位置为
4 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 (n=3,样例)
5 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 (n=4)
我们凭借极其敏锐的眼光发现这组序列为
435 642 1357 642 35 4 (n=3,样例)
5 46 753 2468 97531 2468 753 46 5 (n=4)
即长度为1,2,3,4,...,n,n+1,n,...,4,3,2,1这样的2n+1组等差序列
我们讨论第1~n+1组序列,这些序列满足
*公差的绝对值为2
*奇数组为降序列,偶数组为升序列
*对于第i组(1<=i<=n+1),若为奇数组则首项为n+i,偶数组则首项为n-i+2
对于第n+2~2n+1组,可以由对称性求出。
输出时从第二组开始即可。
把规律总结成这样后,代码应该很好写了吧
/* ID: hubiao cave PROG: shuttle LANG: C++ */ #include<iostream> #include<fstream> #include<string> using namespace std; /*数据分析 Usaco在这题上并没有指明不可以用分析法,而且dfs肯定TLE,所以我们取巧。 先观察样例数据,如果把还没移动的那一步也算上,那么空格的位置为 4 3 5 6 4 2 1 3 5 7 6 4 2 3 5 4 (n=3,样例) 5 4 6 7 5 3 2 4 6 8 9 7 5 3 1 2 4 6 8 7 5 3 4 6 5 (n=4) 我们凭借极其敏锐的眼光发现这组序列为 435 642 1357 642 35 4 (n=3,样例) 5 46 753 2468 97531 2468 753 46 5 (n=4) 即长度为1,2,3,4,...,n,n+1,n,...,4,3,2,1这样的2n+1组等差序列 我们讨论第1~n+1组序列,这些序列满足 *公差的绝对值为2 *奇数组为降序列,偶数组为升序列 *对于第i组(1<=i<=n+1),若为奇数组则首项为n+i,偶数组则首项为n-i+2 对于第n+2~2n+1组,可以由对称性求出。 输出时从第二组开始即可。 把规律总结成这样后,代码应该很好写了吧*/ int main() { int ary[50000]={0}; ifstream fin("shuttle.in"); ofstream fout("shuttle.out"); int n,cnt=0; fin>>n; for(int i=2;i<=n+1;i++) { if(i%2) { for(int j=0;j<i;j++) { ary[cnt++]=n+i-j*2; } } else { for(int j=0;j<i;j++) { ary[cnt++]=n-i+2+j*2; } } } for(int i=n;i>=2;i--) { if(i%2) { for(int j=0;j<i;j++) { ary[cnt++]=n+i-j*2; } } else { for(int j=0;j<i;j++) { ary[cnt++]=n-i+2+j*2; } } } ary[cnt++]=n+1; for(int i=0;i<cnt;i++) { fout<<ary[i]; if((i+1)%20==0||i==cnt-1) fout<<endl; else fout<<" "; } return 0; }
USACO 4.4 Shuttle Puzzle (新年继续跪)
原文:http://www.cnblogs.com/cavehubiao/p/3542217.html