lsmCC 发表于 2023-10-9 20:28:38

牛客蛇形矩阵

#include <bits/stdc++.h>
using namespace std;
int a;
int main()
{
    int n,k=1,looper,x=0,y=0,num=1,tol=0;;
    cin>>n;
    looper =n*n;
    a=1;
    while(num<=looper)
    {
      num++;   //a
      y++;
      tol++;
      a=num;
      for(int i=0;i<tol;i++)
      {
            num++;
            x++;
            y--;
            a=num;//a
      }
      num++;
      x++;            //a
      tol++;   
      a=num;
      for(int i=0;i<tol;i++)
      {
            num++;
            x--;
            y++;
            a=num;
      }
      
      
    }
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            cout<<a<<" ";
      }
      cout<<endl;

    }
   
   
   
}
我发现到10的时候就变为右上了,后面的值不对,应该怎么改呢,或者还有其他更好的解法,要有注释不然看不懂

Mike_python小 发表于 2023-10-9 20:28:39

请问您的问题是关于牛客网蛇形矩阵题目代码的修改,因为当计算到10的时候出现错误了,希望找到正确的解法,并且需要有注释说明吗?

如果是这样的话,我先解释一下原代码的思路:

1.首先输入一个整数n,表示蛇形矩阵的维度为n * n<BR>
2.用一个二维数组a存储生成的蛇形矩阵<BR>
3.从(0,0)点开始,按照顺时针方向,依次向右、下、左、上生成数字<BR>
4.每生成一行/列,就更新循环次数tol和当前点的坐标x,y<BR>
5.直到生成的数字个数达到n*n为止<BR>
6.最后输出生成的蛇形矩阵

对于当前代码中计算到10就出现错误的问题,是因为在第二行打印数字时,因为x已经增加到了1,所以打印的位置不对。解决这个问题可以将第二个循环改成如下代码:


for(int i=0;i<tol-1;i++)//注意这里循环次数减1
{
    num++;
    x++;
    y--;
    a=num;   
}


这样就可以避免x增加到1的情况了。同时,因为第二个循环结束后,y也减少了1个单位,所以在更新当前点坐标的时候需要将y加上1。修改后的代码如下:


#include <bits/stdc++.h>
using namespace std;

int a;

int main() {
    int n,k=1,looper,x=0,y=0,num=1,tol=0;;
    cin>>n;
    looper =n*n;
    a=1;

    while(num<=looper)
    {
      num++;//a
      y++;
      tol++;
      a=num;
      for(int i=0;i<tol-1;i++)//注意这里循环次数减1
      {
            num++;
            x++;
            y--;
            a=num;   
      }

      num++;
      x++;   //a
      tol++;   
      a=num;   

      for(int i=0;i<tol-1;i++)//注意这里循环次数减1
      {
            num++;
            x--;
            y++;
            a=num;   
      }         
   }

    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            cout<<a<<" ";
      }
      cout<<endl;   
    }   
    return 0;
}


以上是修改后的代码,并且我在注释中对于修改部分做了标注,希望能帮到您。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-10-9 20:29:27

这是一个蛇形矩阵的生成程序,但是在数字到达10的时候就出现了问题,因为此时应该往左走而不是往上走。可以通过修改循环的条件来解决这个问题。以下是修改后的代码:

#include <bits/stdc++.h>
using namespace std;
int a;
int main()
{
    int n,k=1,looper,x=0,y=0,num=1,tol=0;;
    cin>>n;
    looper =n*n;
    a=1;
    while(num<=looper)
    {
      num++;
      y++;
      tol++;
      a=num;
      for(int i=0;i<tol-1;i++) // 修改循环条件
      {
            num++;
            x++;
            y--;
            a=num;
      }
      if(num > looper) break; // 添加判断条件
      num++;
      x++;
      tol++;
      a=num;
      for(int i=0;i<tol-1;i++)
      {
            num++;
            x--;
            y++;
            a=num;
      }
    }
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
            cout<<a[ i]<<" ";
      }
      cout<<endl;
    }
}


修改后的程序中,第一个for循环的条件变成了 for(int i=0;i<tol-1;i++) ,这是因为在第一次循环时已经将y加了1,所以后面的循环次数要减1。同时,在第二个for循环前添加了一个判断条件 if(num > looper) break; ,用来判断是否已经生成完整个矩阵,如果已经生成完毕,则跳出循环。
页: [1]
查看完整版本: 牛客蛇形矩阵