蛇形填数 题目 求解答!!

ANMS 2017-04-25 07:37:20

// 蛇形填数 题目
//

#include "stdafx.h"
#include <string.h>
#define maxn 20
int a[maxn][maxn];
int main()
{
int n, x, y, top = 0;
scanf_s("%d", &n);
memset(a, 0, sizeof(a));
top = a[x = 0][y = n - 1] = 1;
while (top < n*n)
{
while (x + 1 < n && !a[x + 1][y])// 这个地方不很理解!!
a[++x][y] = ++top;
while (y - 1 >=0 && !a[x][y - 1])
a[x][--y] = ++top;
while (x - 1 >= 0 && !a[x - 1][y])
a[--x][y] = ++top;
while (y + 1 < n && !a[x][y+1])
a[x][++y] = ++top;

}
for (x = 0; x < n; x++)
{
for (y = 0; y < n; y++)
printf("%3d", a[x][y]);
printf("\n");

}
getchar();
getchar();
return 0;
}

以上是蛇形填数的 代码,其中有几个地方不太明白:
1. 代码中的! !a[x + 1][y] 是什么意思呢,该怎样理解呢,(我知道是!是逻辑非)
2.题解中说明 a[x + 1][y] ==0 和!a[x + 1][y] 是相等的, a[x + 1][y] ==0这个又是该怎样理解呢?
3.希望大牛能够帮我解答这个疑惑,如果能把这个题的流程给我再详细说下就更好了,万分感谢!!!
...全文
309 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-04-28
  • 打赏
  • 举报
回复
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");
    }
}

棉猴 2017-04-28
  • 打赏
  • 举报
回复
根据您提供的内容写了一个小文章 http://blog.csdn.net/hou09tian/article/details/70889235 还请多指教
棉猴 2017-04-28
  • 打赏
  • 举报
回复
不同颜色对应不同代码
棉猴 2017-04-28
  • 打赏
  • 举报
回复

其中while循环条件语句中&&后面的表达式,比如
!a[x + 1][y]
的含义是判断当前位置的值是否是0,如果是0则说明该位置没有被赋值,可以继续赋值,如果该位置上的值不是0,则说明之前已经赋过值,就不能再赋值了。比如上图中紫色部分,在赋值完16之后,按照顺序还要继续赋值1所在的位置,如果不加判断,则会把1的值覆盖,加了该判断之后,发现该位置的值不为0,所以不会对该位置进行赋值。同理,在赋值完16之后,应该竖起继续赋值17、18、19,在赋值19之后,按照程序应该继续赋值6所在的位置,但是判断该位置的值不是0,说明之前已经赋值过了,所以不会再次赋值,而是继续从右向左赋值20、21、22
ANMS 2017-04-27
  • 打赏
  • 举报
回复
明白了,感谢!!!
莫笑青春 2017-04-27
  • 打赏
  • 举报
回复
while(0)结束循环 while(!0)一直循环 1&&1 =1 1&&0 = 0 0&&1 = 0 0&&0 = 0 你在仔细想想运行过程就理解了
赵4老师 2017-04-26
  • 打赏
  • 举报
回复
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--------------
  • 打赏
  • 举报
回复
如果a的值是0,那么!a就是1;如果a的值不是0,那么!a的值就是0。
ANMS 2017-04-26
  • 打赏
  • 举报
回复
还有一点 ,memset(a, 0, sizeof(a));这条语句不是已经把数组清零了吗,也就是说给数组赋了0 的值,那么下面的 !a[x][y+1] 不应该是1 吗,就是这一点想不清!,希望大神给小弟点思路,先谢过了!!!
ANMS 2017-04-26
  • 打赏
  • 举报
回复
感谢大家!!非常感谢!!!!
莫笑青春 2017-04-26
  • 打赏
  • 举报
回复
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 就是还没有被赋值。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧