qq_45735316 2020-09-23 22:45 采纳率: 94.1%
浏览 95
已采纳

【回型矩阵】为什么行数>列数的时候这个代码能输出正确结果但是行数<列数的时候输出结果就错误了?

图片说明


#include <iostream>

#include <iomanip>

using namespace std;



int main()

{
#define M   5 //矩阵行数
#define N     7 //矩阵列数
    int matrix[M][N] = { 0 };
    int row = 0;
    int col = 0;
    int start = 1; //起始值
    int m = M;
    int n = N;

    //可以画N/2个圈

    for (int count = 0; count < N / 2; count++)
    {
        for (col=count; col < n - 1; col++) //a排赋值
        {
            matrix[row][col] = start++;
        }
        for (row=count; row < m - 1; row++) //b排赋值
        {
            matrix[row][col] = start++;
        }
        for (col = n - 1; col > count; col--) //c排赋值
        {
            matrix[row][col] = start++;
        }
        for (row = m - 1; row > count; row--) //d排赋值
        {
            matrix[row][col] = start++;
        }
        //进入下一圈
        m--;
        n--;
        row++;
        start--; //这里是因为在换圈的时候会多加1
    }
    if (N % 2 != 0) //如果size为奇数则最后中间那一个数遍历不到,这里补上
    {
        int  z = M - 2 * row;
        for (int i = 0; i < z; ++i)
            matrix[row++][col + 1] = ++start;
    }
    //输出数组
    for (int i = 0; i < M; i++)
    {

        for (int j = 0; j < N; j++)
        {

            cout << setw(3) << matrix[i][j];//设定输出宽度为3

        }
        cout << endl;

    }
    return 0;

}
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-09-24 01:36
    关注

    行数>列数你的程序也不对
    8行7列你的程序输出如下

      1  2  3  4  5  6  7
     26 26 27 28 29 30  8
     25 43 43 44 45 31  9
     24 42 52 53 46 32 10
     23 41 51 54 47 33 11
     22 40 50 49 48 34 12
     21 39 38 37 36 35 13
     20 19 18 17 16 15 14
    

    你看到2个26,2个43了么

    你想复杂了,直接这么绕圈,遇到边界或者已经填充(不为0)就转弯,即可。

    #include <iostream>
    #include <cstring>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
    #define M   8 //矩阵行数
    #define N     7 //矩阵列数
        int matrix[M][N] = { 0 };
        memset(matrix, 0, M*N);
        int i = 0, j = 0;
        int di = 0, dj = 1;
        int a = 1;
        while (a <= M * N)
        {
            matrix[i][j] = a++;
            if (di == 0 && dj == 1)
            {
                if (j >= N - 1 || matrix[i][j + 1] != 0)
                {   
                    di = 1; dj = 0; 
                }
            }
            else if (di == 1 && dj == 0)
            {
                if (i >= M - 1 || matrix[i + 1][j] != 0)
                {   
                    di = 0; dj = -1; 
                }       
            }
            else if (di == 0 && dj == -1)
            {
                if (j <= 0 || matrix[i][j - 1] != 0)
                {   
                    di = -1; dj = 0; 
                }       
            }
            else
            {
                if (i <= 0 || matrix[i - 1][j] != 0)
                {   
                    di = 0; dj = 1; 
                }               
            }
            i += di;
            j += dj;
        }
        //输出数组
        for (int i = 0; i < M; i++)
        {
    
            for (int j = 0; j < N; j++)
            {
    
                cout << setw(3) << matrix[i][j];//设定输出宽度为3
    
            }
            cout << endl;
    
        }
        return 0;
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码