C语言蛇形填数想知道我自己的代码有什么问题

编译器是vs
题目如图

img

思路如图

img


确定四个点然后循环嘛
但是运行后就是出了问题,也不知道问题在哪,编译器也没报错
代码如下

img

img

img

img

确定顶点的思路在详细说说,这个蛇形的是旋转的,4个顶点不好确认,只能按照方向来。
还有你的代码贴到代码块里面这样方便看和运行

你这蛇形图看不清楚啊,题目贴出来看看

#include<stdio.h>
int main()
{
    enum dir{down=0,left,up,right};
    int a[10][10] = {0};
    int m;
    scanf("%d",&m);
    int k=0,i=0,j=3,n=1;
    dir d = down;
    for(k=0;k<m*m;k++)
    {
        a[i][j] = n;
        n++;
        switch(d)
        {
        case down:
            {
                if(i==m-1 || a[i+1][j] != 0)
                {
                    d = left;
                    j--;
                }
                else
                    i++;
            }
            break;
        case left:
            {
                if(j==0 || a[i][j-1] != 0)
                {
                    d = up;
                    i--;
                }
                else
                    j--;
            }
            break;
        case up:
            {
                if(i==0 || a[i-1][j] != 0)
                {
                    d = right;
                    j++;
                }
                else 
                    i--;
            }
            break;
        case right:
            {
                if(j==m-1 || a[i][j+1] != 0)
                {
                    d = down;
                    i++;
                }
                else
                    j++;
            }
            break;
        }
    }

    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
            printf("%3d",a[i][j]);
        printf("\n");
    }
    return 0;
}

参考链接

蛇形填数(C语言)_没吃饱呀俺的博客-CSDN博客_c语言蛇形填数 从1开始依次填写。设“笔”的坐标为(i,j),则一开始就是i=0,j=n-1,即第0行,第n-1列(行列的范围是0~n-1,没有第n列)。“笔”的移动轨迹是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之,先是下,到不能填为止,然后是左,接着是上,最后是右。“不能填”是指再走就出界,或者再走就要走到以前填过的格子。如果把格子都初始化为0,就能很方便的加以判断。样例输入:3样例输出: 7 8 1 6 9 2 5 4 3模拟图:... https://blog.csdn.net/m0_63015538/article/details/122619276?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166781079016800180695292%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166781079016800180695292&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-122619276-null-null.nonecase&utm_term=C%E8%AF%AD%E8%A8%80%E8%9B%87%E5%BD%A2%E5%A1%AB%E6%95%B0%E4%BD%86%E8%BE%93%E5%87%BA%E9%94%99%E8%AF%AF&spm=1018.2226.3001.4450

看的不是很清楚

首先确定你的输入只有一个,也就是 n, 后面那么多 scanf_s 肯定是不对的,直接对数组赋值,你看看是想用y还是想用个全局变量一直➕,这里考虑下

img

#include<stdio.h>
#include<string.h>
#define max 100
int a[max][max];
int main()
{
    int x, y;
    int n;
    int start;
    scanf("%d",&n);
    memset(a, 0, sizeof(a));
    x = 0;
    y = n - 1;
    start = a[x][y] = 1;
    while (start < n * n)
    {
        while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++start;
        while (y - 1 >=0 && !a[x][y-1])   a[x][--y] = ++start;
        while (x-1>= 0 && !a[x - 1][y])   a[--x][y] = ++start;
        while (y + 1 < n && !a[x][y+1])   a[x][++y] = ++start;
    }
    for (x = 0; x < n; x++)
    {
        for (y = 0; y < n; y++)
            printf("%3d", a[x][y]);
        printf("\n");
 
    }
    return 0;
}

这道题其实不太复杂吧?其实只要从1开始(起点),遇到要转弯的地方判断一下。
首先用两个变量(x和y,其中x=0,y=n-1,其实这两个变量就是初始下标)存起点(a[x][y]=1),然后while循环(tot用于存储方阵每个位置的值,所以初始化为1。这里tot<n×n是当tot的值等于n×n(蛇形方阵的最后一个值),那就跳出循环,输出)
下面,while循环里面,我的代码中“x+1<=n-1&&a[x+1][y]==0”的逻辑与(&&)具有“断路功能”,就是一旦左边条件越界不成立就“断开”,右边的条件就不会出现下标越界。下面的以此类推。
(注意:因为这个蛇形矩阵的方向顺序是:下,左,上,右……,所以要先判断:如果行下标+1小于等于第n行-1(x+1<=n-1),并且下一行还没有存值,那么说明还没到转弯点,就执行。剩下的向左,向上,向右的判断方法,以此类推。并且题主请注意,这四个判断条件不能调换位置!因为蛇形方阵的顺序永远是:下,左,上,右,下,左,上,右……
其实这个while循环就是模拟蛇形方阵的形成过程。
(说这么详细,题主应该懂了吧?)
运行无报错,样例正确,代码:

#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int main()
{
    int n,x,tot,y;
    scanf("%d",&n);
    x=0;
    y=n-1;
    tot=1;
    a[x][y]=1;//1的位置(起始位置)
    while(tot<n*n){//四个方向模拟 
        while(x+1<=n-1&&a[x+1][y]==0){
            x++;
            tot++;
            a[x][y]=tot;
        }
        while(y-1>=0&&a[x][y-1]==0){
            y--;
            tot++;
            a[x][y]=tot;
        }
        while(x-1>=0&&a[x-1][y]==0){
            x--;
            tot++;
            a[x][y]=tot;
        }
        while(y+1<=n-1&&a[x][y+1]==0){
            y++;
            tot++;
            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;
}

运行效果图:

img


希望能帮助到题主!!🤣🙏🙏🤝

各位,我想实现的效果是这样

#include<stdio.h>
int main(void)
{
    int snake[8][8]={0};
    int n;
    printf("输入n:");
    scanf_s("%d", &n);//确立数组大小;
    int m;//实际角标
    m = n - 1;


    int a_1, a_2;//正方形的四个点;
    a_1 = 0;
    a_2 = m;

    int b_1, b_2;
    b_1 = m;
    b_2 = m - 1;

    int c_1, c_2;
    c_1 = m - 1;
    c_2 = 0;

    int d_1, d_2;
    d_1 = 0;
    d_2 = 1;

    int y_1 = 0;//y记录单个方向循环次数
    int y_2 = 0;
    int y_3 = 0;
    int y_4 = 0;

    int z_a = m + 1;//z确立每个矢量的累加次数上限
    int z_b = m;
    int z_c = m;
    int z_d = m - 1;

    if (n == 1)//区分奇偶
        n++;
    else if (n / 2 != 0)
        n++;

    for (int x=0; x < (n+1) / 2; x++)//x为总计次器,记录整圈循环
    {

        for (int z_1 = 0; y_1 < n / 2;z_1++)//a点移动次数不随奇偶改变,n/2和(n+1)/2结果是相同的
        {
            if (z_1 == z_a || z_a <= 0)//判断累加次数是否达到上限
            {
                z_1 = 0;//重置累加次数
                z_a -= 2;//上限每次减2
                break;
            }
            scanf_s("%d", &snake[a_1][a_2]);//a点往左下方走,行数+1,列数-1,且a点往下灌值,所以让行数参与循环
            a_1++;
        }
        y_1++;
        a_1 = 0 + y_1;//移动起始点a
        a_2--;
        

        for (int z_2 = 0; y_2 < (m + 1) / 2;z_2++)//b点移动次数会随奇偶改变的,当n为奇数时,m为偶数,(m+1)/2会比n/2少一次
        {                                                                                  //当n为偶数时,m为奇数,(m+1)/2等于n/2
            if (z_2 == z_b||z_b<=0)
            {
                z_2 = 0;
                z_b -= 2;
                break;
            }
            scanf_s("%d", &snake[b_1][b_2]);//b点往左上方走,行数-1,列数-1,且b点往左灌值,所以让列数参与循环
            b_2--;
        }
        y_2++;
        b_1--;//移动起始点b
        b_2 = m - 1 - y_2;

        for (int z_3 = 0; y_3 < (m + 1) / 2;z_3++)//c点同理
        {
            if (z_3 == z_c || z_c <= 0)
            {
                z_3 = 0;
                z_c -= 2;
                break;
            }
            scanf_s("%d", &snake[c_1][c_2]);//c点往右上方走,行数-1,列数+1,且c点往上灌值,让行数参与循环
            c_1 --;
        }
        y_3++;
        c_1 = m - 1 - y_3;//移动起始点c
        c_2++;

        for (int z_4 = 0; y_4 < m / 2;z_4++)//d点移动次数也不会随着奇偶改变,而且永远比a少一次,所以m/2也不会随着奇偶改变
        {
            if (z_4 == z_d || z_d <= 0)
            {
                z_4 = 0;
                z_d -= 2;
                break;
            }
            scanf_s("%d", &snake[d_1][d_2]);//d点往右下方走,行数+1,列数+1,且d点往右灌值,让列数参与循环
            d_2++;
        }
        y_4++;
        d_1++;
        d_2 = 1 + y_4;//移动起始点d
    }

    for (int i = 0; i < m+1; i++)//嵌套循环输出值
    {
        for (int j = 0; j < m+1; j++)
        {
            printf("%3d", snake[i][j]);
        }
        printf("\n");
    }

    return 0;
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/706318529766157.png "#left")

就是说,不是题目只输入个n那种,我在尝试新的东西

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632