1 条题解
-
1
made in china
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int M=21; int l[5]={0,-1,0,1,0}; int r[5]={0,0,1,0,-1}; int a[M][M],b[M*M][3];// 螺旋矩阵的值、各值的坐标 int c[M*M],n,k; //c记录“王”棋子遍历的轨迹 bool d[M*M],flag=false; //记录矩阵中各个位置是否遍历 void dfs(int t,int x1, int y1) //从第t步开始,当前位置在(x1,y1)时的遍历路径 { int i,x,y; if (flag) return; if (t>n*n) { cout<<c[1]; for (i=2; i<=n*n; i++) cout<<' '<<c[i]; cout<<endl; flag=true; return; } for (i=1; i<=4; i++) { x=x1+l[i]; y=y1+r[i]; if ((x>=1)&&(x<=n)&&(y>=1)&&(y<=n)&&(d[a[x][y]])) { d[a[x][y]]=!d[a[x][y]]; c[t]=a[x][y]; dfs(t+1,x,y); c[t]=0; d[a[x][y]]=!d[a[x][y]]; } } } void out2() //处理奇数情况,根据情况搜索 { memset(c,0,sizeof(c)); memset(d,true,sizeof(d)); if ((b[k][1]+b[k][2])%2==1) cout<<"No Path"<<endl; else { c[1]=k; d[k]=!d[k]; dfs(2,b[k][1],b[k][2]); } } void out1() //处理n为偶数情况,按上图所示的方式产生回路 { int d[M*M],x,y,i,t,f,p,z; for (i=1; i<=n; i++) d[i]=i; t=n*n/2+1; for (i=n; i>=1; i--) { d[t]=a[1][i]; t++; } t=n+1; z=n*n/2; x=n-1; y=n; f=-1; while (t<=z) { d[t]=a[x][y]; t++; if ((f==-1)&&(y>n/2+1)) y--; else if ((f==-1)&&(y==n/2+1)) {x--; f=1;} else if ((f==1) &&(y<n)) y++; else { f=-1; x--; } } t=n*n/2+n+1; f=1; x=2; y=1; while (t<=n*n) { d[t]=a[x][y]; t++; if ((f==1)&&(y<n/2)) y++; else if ((f==1)&&(y==n/2)) {f=-1; x++;} else if ((f==-1)&&(y>1)) y--; else { f=1; x++;} } p=1; while (d[p]!=k) p++; for (i=p; i<=n*n; i++) cout<<d[i]<<' '; for (i=1; i<p; i++) if (i!=(p-1)) cout<<d[i]<<' '; else cout<<d[p-1]<<endl; } void jz() { int i,j,x,y,z,t,f; x=n; y=1; t=1; f=1; z=n*n; while (t<=z) { a[x][y]=t; b[t][1]=x; b[t][2]=y; t++; if ((f==1)&&(y<n)&&(a[x][y+1]==0)) y++; else if ((f==1)&&((y==n)||(a[x][y+1]>0))){f=2; x--;} else if ((f==2)&&(x>1)&&(a[x-1][y]==0)) x--; else if ((f==2)&&((x==1)||(a[x-1][y]>0))) {f=3; y--;} else if ((f==3)&&(y>1)&&(a[x][y-1]==0)) y--; else if ((f==3)&&((y==1)||(a[x][y-1]>0))) {f=4; x++;} else if ((f==4)&&(x<n)&&(a[x+1][y]==0)) x++; else { f=1; y++;} } for (i=1; i<=n; i++) { for (j=1; j<=n; j++) printf("%4d",a[i][j]); printf("\n"); } } int main() { cin>>n>>k; jz(); if (n%2==0) out1(); else out2(); fclose(stdin); fclose(stdout); return 0; }
- 1
信息
- ID
- 1527
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者