在nn的方阵中填入1,2,…,nn,要求填成蛇形。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int arr[10][10],x,y;
memset(arr,0,sizeof(arr));
arr[x=1][y=n]=1;
int tot=1;
while(tot<n*n)
{
while(x+1<=n&&arr[x+1][y]==0) arr[++x][y]=++tot;//判断向下的位置,在n的范围内如果是0(即未定义过),依次赋值
while(y-1>=1&&arr[x][y-1]==0) arr[x][--y]=++tot;//向左
while(x-1>=1&&arr[x-1][y]==0) arr[--x][y]=++tot;//向上
while(y+1<=n&&arr[x][y+1]==0) arr[x][++y]=++tot;//向下
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%3d ",arr[i][j]);
}
printf("\n");
}
}
return 0;
}
难点:即插入计数tot,在外面的大while循环中,规定<n*n的范围(因为是++tot),即第一位(1,n)在大while循环外已经定义了,然后在While循环里的就是直接上手(1,n-1)的定值了。while中套多个while设边界。
解法:通俗易懂地说就是碰墙拐弯,至于怎么拐,通过是否符合各个小while来解。
之前我所犯的错误:
while(x+1<=n&&arr[x+1][y]==0) arr[++x][y]=tot++;
while(y-1>=1&&arr[x][y-1]==0) arr[x][y--]=tot++;
while(x-1>=1&&arr[x-1][y]==0) arr[x--][y]=tot++;
while(y+1<=n&&arr[x][y+1]==0) arr[x][y++]=tot++;
显而易见 就是x++与++x的区别。如果我是x++的话,就是越位判别了,即多了一位,那么会造成 最后(即最中间的一位)是0的情况