螺旋矩阵 | ||||||
|
||||||
Description | ||||||
对于给定的一个数n,要你打印n*n的螺旋矩阵。 比如n=3时,输出: 1 2 3 |
||||||
Input | ||||||
多组测试数据,每个测试数据包含一个整数n(1<=n<=32) | ||||||
Output | ||||||
对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里。 在一组测试数据中,每个数占的字符宽度是该组数据中最大的数位数加1,比如3*3的螺旋矩阵,最大值是9,那么每个数就要占2个字符宽度。 两组测试数据之间用一个空行隔开。 |
||||||
Sample Input | ||||||
1 2 3 |
||||||
Sample Output | ||||||
1 1 2 4 3 1 2 3 8 9 4 7 6 5 |
水题一发,输出部分学到一个新知识,宽度控制可以这样来控制:
printf("%*d",len+1,ans[i][j]);然后剩下的内容就比较简单了,我从坐标(1,1)出发 ,然后用1、2、3、4分别标记四个方向,当前方向一直走下去,如果碰到了边界或者是走过的地方,右转即可、
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<cstdio> #include<iostream> using namespace std; int ans[50][50]; int vis[50][50]; //1right,2down,3left,4up int n; int check(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=n&&vis[x][y]==0)return 1; else return 0; } void dfs(int x,int y,int num,int cur) { //printf("%d %d\n",x,y); ans[x][y]=num; vis[x][y]=1; if(cur==1)//1右、2下、3左、4上。 { int xx=x; int yy=y+1; if(ans[xx][yy]||yy>n)//如果走到的地方已经有了数据或者是碰到了边界 { xx=x+1; yy=y; if(check(xx,yy))//右转并且保证走的地方合法 dfs(xx,yy,num+1,2); } else { if(check(xx,yy))//继续走 dfs(xx,yy,num+1,cur); } } if(cur==2)//1right,2down,3left,4up { int xx=x+1; int yy=y; if(ans[xx][yy]||xx>n) { xx=x; yy=y-1; if(check(xx,yy)) dfs(xx,yy,num+1,3); } else { if(check(xx,yy)) dfs(xx,yy,num+1,cur); } } if(cur==3)//1right,2down,3left,4up { int xx=x; int yy=y-1; if(ans[xx][yy]||yy<1) { xx=x-1; yy=y; if(check(xx,yy)) dfs(xx,yy,num+1,4); } else { if(check(xx,yy)) dfs(xx,yy,num+1,cur); } } if(cur==4) { int xx=x-1; int yy=y; if(ans[xx][yy]) { xx=x; yy=y+1; if(check(xx,yy)) dfs(xx,yy,num+1,1); } else { if(check(xx,yy)) dfs(xx,yy,num+1,cur); } } return ; } int main() { int f=0; while(~scanf("%d",&n)) { if(f!=0) { printf("\n"); } f++; int date=n*n; int len=0; while(date) { date/=10; len++; } //printf("%d\n",len); memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); dfs(1,1,1,1); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%*d",len+1,ans[i][j]); } printf("\n"); } } }