sgu 109 Magic of David Copperfield II
题意:略。
奇数的话,只要留下中心。只要2轮,先将除中心的奇数编号去掉。再将偶数编号去掉。行动奇数距离。
偶数的话逐层去,先去最外层,去掉与1,1的曼哈顿距离为偶数且在最外层的,再去掉曼哈顿距离为奇数且在最外层的。类推。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=150,INF=0x7FFFFFFF; int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int vst[SZ][SZ]; void dfs(int x,int y,int src,int n) { int srcx=x; if(x==n/2) { if(src==1)cout<<" "<<((x-1)*n+y-1); else cout<<" "<<((x-1)*n+y)<<" "<<(x*n+y-1); return; } int d=0,cnt=src; if(!(cnt&1)) { cout<<" "<<((x-1)*n+y); vst[x][y]=srcx; } for(;;) { if(x==y&&x==srcx)return; int nx=x+dx[d],ny=y+dy[d]; //cout<<endl; //cout<<nx<<" "<<ny<<" "<<d<<endl; if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&(vst[nx][ny]==0||vst[nx][ny]==srcx)) { x=nx,y=ny; ++cnt; if(!(cnt&1)) { cout<<" "<<((x-1)*n+y); vst[nx][ny]=srcx; } } else { ++d; } } } int main() { //cout<<ceil(-10.3)<<endl; std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int n; cin>>n; if(n>=2&&n&1) { cout<<n; for(int i=1;i<=n*n;++i)if((i&1)&&(i!=(n*n/2+1)))cout<<" "<<i; cout<<endl; cout<<n+2; for(int i=1;i<=n*n;++i)if(!(i&1))cout<<" "<<i; cout<<endl; } else if(!(n&1)) { for(int i=0;i<n;++i) { cout<<n+1+2*i; dfs(i/2+1,i/2+2,!(i&1),n); cout<<endl; } } return 0; }