在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("= ",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的情况
