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

问题描述:

图片说明


#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;

}

行数>列数你的程序也不对
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;

}