user-0 提问: 蛇形填数 题目 求解答！！

回复:
user: user-1
content: Do not let me think!#include <stdio.h> #define MAXN 100 int m[MAXN+2][MAXN+2]; char d; int x,y,k,n,w; char str[10]; void main() {     while (1) {         printf("Input n(1..%d):",MAXN);         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&n)) {             if (1<=n && n<=MAXN) break;         }     }     y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;     y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;     x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;     x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             m[y][x]=0;         }     }     x=1;     y=1;     k=0;     d='D';     while (1) {         k++;         if (k>n*n) break;         m[y][x]=k;         switch (d) {             case 'D':                 if (0==m[y+1][x])  y++;                 else              {x++;d='R';}             break;             case 'R':                 if (0==m[y][x+1])  x++;                 else              {y--;d='U';}             break;             case 'U':                 if (0==m[y-1][x])  y--;                 else              {x--;d='L';}             break;             case 'L':                 if (0==m[y][x-1])  x--;                 else              {y++;d='D';}             break;         }     } 	w=sprintf(str,"%d",n*n);     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             printf(" %0*d",w,m[y][x]);         }         printf("\n");     } }

user: user-2
content: 根据您提供的内容写了一个小文章 http://blog.csdn.net/hou09tian/article/details/70889235 还请多指教

user: user-2
content: 不同颜色对应不同代码

user: user-2
content: 其中while循环条件语句中&&后面的表达式，比如 !a[x + 1][y] 的含义是判断当前位置的值是否是0，如果是0则说明该位置没有被赋值，可以继续赋值，如果该位置上的值不是0，则说明之前已经赋过值，就不能再赋值了。比如上图中紫色部分，在赋值完16之后，按照顺序还要继续赋值1所在的位置，如果不加判断，则会把1的值覆盖，加了该判断之后，发现该位置的值不为0，所以不会对该位置进行赋值。同理，在赋值完16之后，应该竖起继续赋值17、18、19,在赋值19之后，按照程序应该继续赋值6所在的位置，但是判断该位置的值不是0，说明之前已经赋值过了，所以不会再次赋值，而是继续从右向左赋值20、21、22

user: user-0
content: 明白了，感谢！！！

user: user-3
content: while(0)结束循环 while(!0)一直循环     1&&1 =1  1&&0  = 0  0&&1 = 0  0&&0 = 0  你在仔细想想运行过程就理解了

user: user-1
content: Do not let me think! //n=1, //1 //n=2, //12 //34 //n=3, //126 //357 //489 //n=4, //  1  2  6  7 //  3  5  8 13 //  4  9 12 14 // 10 11 15 16 //n=5, //  1  2  6  7 15 //  3  5  8 14 16 //  4  9 13 17 22 // 10 12 18 21 23 // 11 19 20 24 25 //之字形 //模仿蚂蚁爬的过程 #include <stdio.h> #define MAXN 9 int m[MAXN][MAXN]; int i,x,y,dx,dy,n,n2,k; void main() {     for (i=1;i<=MAXN;i++) {         n2=i*i;         k=1;         if (n2>9) k=3;         x=0;         y=0;         dx=1;         dy=-1;         n=1;         m[y][x]=n;         while (1) {             if (n>=n2) break;             n++;             x=x+dx;             y=y+dy;             if (y>=i) {                 x=x+2;                 y=i-1;                 dx=1;                 dy=-1;             }             if (x>=i) {                 y=y+2;                 x=i-1;                 dx=-1;                 dy=1;             }             if (y<0) {                 y=0;                 dx=-1;                 dy=1;             }             if (x<0) {                 x=0;                 dx=1;                 dy=-1;             }             m[y][x]=n;         }         for (y=0;y<i;y++) {             for (x=0;x<i;x++) {                 printf("%*d",k,m[y][x]);             }             printf("\n");         }         printf("-------------%d--------------\n",i);     } } //1 //-------------1-------------- //12 //34 //-------------2-------------- //126 //357 //489 //-------------3-------------- //  1  2  6  7 //  3  5  8 13 //  4  9 12 14 // 10 11 15 16 //-------------4-------------- //  1  2  6  7 15 //  3  5  8 14 16 //  4  9 13 17 22 // 10 12 18 21 23 // 11 19 20 24 25 //-------------5-------------- //  1  2  6  7 15 16 //  3  5  8 14 17 26 //  4  9 13 18 25 27 // 10 12 19 24 28 33 // 11 20 23 29 32 34 // 21 22 30 31 35 36 //-------------6-------------- //  1  2  6  7 15 16 28 //  3  5  8 14 17 27 29 //  4  9 13 18 26 30 39 // 10 12 19 25 31 38 40 // 11 20 24 32 37 41 46 // 21 23 33 36 42 45 47 // 22 34 35 43 44 48 49 //-------------7-------------- //  1  2  6  7 15 16 28 29 //  3  5  8 14 17 27 30 43 //  4  9 13 18 26 31 42 44 // 10 12 19 25 32 41 45 54 // 11 20 24 33 40 46 53 55 // 21 23 34 39 47 52 56 61 // 22 35 38 48 51 57 60 62 // 36 37 49 50 58 59 63 64 //-------------8-------------- //  1  2  6  7 15 16 28 29 45 //  3  5  8 14 17 27 30 44 46 //  4  9 13 18 26 31 43 47 60 // 10 12 19 25 32 42 48 59 61 // 11 20 24 33 41 49 58 62 71 // 21 23 34 40 50 57 63 70 72 // 22 35 39 51 56 64 69 73 78 // 36 38 52 55 65 68 74 77 79 // 37 53 54 66 67 75 76 80 81 //-------------9--------------

user: user-4
content: 如果a的值是0，那么！a就是1；如果a的值不是0，那么！a的值就是0。

user: user-0
content: 还有一点 ，memset(a, 0, sizeof(a));这条语句不是已经把数组清零了吗，也就是说给数组赋了0 的值，那么下面的 !a[x][y+1] 不应该是1 吗，就是这一点想不清！，希望大神给小弟点思路，先谢过了！！！

user: user-0
content: 感谢大家！！非常感谢！！！！

user: user-3
content: 1.是判断a[x][y]下面是否赋值，如果没有值即0则运行while下的公式进行赋值，while (top < n*n)第一次循环用不上判断a[x][y]的上下左右，第二次判断才会用到，因为已经有一圈值被确定， 例如n=3 while第一次运行之后是 7 8 1 6     2 5 4 3 因为在最后一个while时a[x][y+1] ＝1  ，!a[x][y+1] ＝0  while (y + 1 < n && !a[x][y+1]) 就停止了。 2.a[x + 1][y] ==0  就是还没有被赋值。