对矩阵进行填数:
| 10 | 11 | 12 | 1 |
| 9 | 16 | 13 | 2 |
| 8 | 15 | 14 | 3 |
| 7 | 6 | 5 | 4 |
输入n,代表矩阵的大小为n*n,然后输入该方阵。
从数1开始填写,设 ”笔“的坐标为( x ,y ),则一开始 x=0,y=n-1。笔的移动情况就是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之就是先下,到不能下为止,然后是左,接着是上,最后是右。
”不能填“指的是再走就走出边界(例如:4→5),或者这个各自已经做到过(例如:12→13)。如果把所有格子都初始化为0,就能够很好的判断。
#include <bits/stdc++.h>
using namespace std;
int a[20][20];
int main()
{int n,tot;cin>>n;int x=0,y=n-1;memset(a,0,sizeof(a));tot=a[0][n-1]=1;while(tot<n*n){while(x+1<n&&!a[x+1][y])//向下走a[++x][y]=++tot;while(y-1>=0&&!a[x][y-1])//向左走a[x][--y]=++tot;while(x-1>=0&&!a[x-1][y])//向上走a[--x][y]=++tot;while(y+1<n&&!a[x][y+1])//向右走a[x][++y]=++tot;}for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<setw(3)<<a[i][j];}cout<<endl;}
}
题目推荐:
nyoj33蛇形填数(原题)
hdu2153仙人球的残影(变形蛇形填数)
nyoj852蛇形填数(二)
//hdu2153仙人球的残影
#include<bits/stdc++.h>
using namespace std;
int a[101][101];
void Show(int x)
{int i,j,m,n;memset(a,0,sizeof(a));i=1;m=1;j=2;n=x;while(i<=n) a[1][i++]=m++;while(j<=n) a[j++][n]=m++;i=n-1;while(i>=1) a[n][i--]=m++;j=n-1;while(j>=2) a[j--][1]=m++;for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(a[i][j])printf("%3d",a[i][j]);elseprintf(" ");cout<<endl;}
}int main()
{int n;while(cin>>n&&n!=0){Show(n);}return 0;
}
//nyoj852蛇形填数(2)
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main()
{int t;cin>>t;while(t--){memset(a,0,sizeof(a));int n;cin>>n;int x=0,y=0,tot;tot=a[x][y]=1;while(tot<(n+1)*n/2){while(y+1<n&&!a[x][y+1])//向右a[x][++y]=++tot;while(y-1>=0&&x+1<n&&!a[x+1][y-1])//向左下a[++x][--y]=++tot;while(x-1>=0&&!a[x-1][y])//向上a[--x][y]=++tot;}for(int i=0;i<n;i++){for(int j=0;j+i<n;j++){if(j)cout<<' ';cout<<a[i][j];}cout<<endl;}}
}