蛇形填数
题目:
输入n,输出n*n的矩阵,从矩阵的右上角,顺时针填入数字。
样例:
输入:4
输出:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
解题思路:
每次都是:向下,向左,向上,向右,
先把数组用0填充,
终止条件:沿着个方向,下一步超过了数组的范围;或者下一步位置的数字不是0,然后就要改变方向,
(代码用到了&&的短路条件,所以x+1>n为真时,不会再去判断[n+1][y]从而出现越界访问)
代码:
#include<iostream>
#include<cstring>
#define maxn 10
using namespace std;
int a[maxn][maxn];
int main()
{
int x,y,n,tot=0;
cin>>n;
memset(a,0,sizeof(a));
tot = a[x=0][y=n-1] = 1;
while(tot< n*n)
{
while(x+1<n && a[x+1][y]==0) a[++x][y]=++tot;
while(y-1>=0 && a[x][y-1]==0) a[x][--y]=++tot;
while(x-1>=0 && a[x-1][y]==0) a[--x][y]=++tot;
while(y+1<n && a[x][y+1]==0) a[x][++y]=++tot;
}
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
printf("%3d ",a[i][j]);
}
printf("\n");
}
return 0;
}