鱼C论坛

 找回密码
 立即注册
查看: 1111|回复: 2

[已解决]牛客蛇形矩阵

[复制链接]
发表于 2023-10-9 20:28:38 | 显示全部楼层 |阅读模式
1鱼币
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[1001][1001];
  4. int main()
  5. {
  6.     int n,k=1,looper,x=0,y=0,num=1,tol=0;;
  7.     cin>>n;
  8.     looper =n*n;
  9.     a[0][0]=1;
  10.     while(num<=looper)
  11.     {
  12.         num++;     //a[0][1]
  13.         y++;
  14.         tol++;
  15.         a[x][y]=num;
  16.         for(int i=0;i<tol;i++)
  17.         {
  18.             num++;
  19.             x++;
  20.             y--;
  21.             a[x][y]=num;  //a[1][0]
  22.         }
  23.         num++;
  24.         x++;              //a[2][0]
  25.         tol++;   
  26.         a[x][y]=num;
  27.         for(int i=0;i<tol;i++)
  28.         {
  29.             num++;
  30.             x--;
  31.             y++;
  32.             a[x][y]=num;
  33.         }
  34.         
  35.         
  36.     }
  37.     for(int i=0;i<n;i++)
  38.     {
  39.         for(int j=0;j<n;j++)
  40.         {
  41.             cout<<a[i][j]<<" ";
  42.         }
  43.         cout<<endl;

  44.     }
  45.    
  46.    
  47.    
  48. }
复制代码

我发现到10的时候就变为右上了,后面的值不对,应该怎么改呢,或者还有其他更好的解法,要有注释不然看不懂
最佳答案
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,所以打印的位置不对。解决这个问题可以将第二个循环改成如下代码:

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

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

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

int a[1001][1001];

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

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

        num++;  
        x++;     //a[2][0]  
        tol++;   
        a[x][y]=num;   

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

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

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

球一个最佳答案谢谢啦!这对我非常重要!

最佳答案

查看完整内容

请问您的问题是关于牛客网蛇形矩阵题目代码的修改,因为当计算到10的时候出现错误了,希望找到正确的解法,并且需要有注释说明吗? 如果是这样的话,我先解释一下原代码的思路: 1.首先输入一个整数n,表示蛇形矩阵的维度为n * n 2.用一个二维数组a存储生成的蛇形矩阵 3.从(0,0)点开始,按照顺时针方向,依次向右、下、左、上生成数字 4.每生成一行/列,就更新循环次数tol和当前点的坐标x,y 5.直到生成的数字个数达到n*n为止 6. ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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,所以打印的位置不对。解决这个问题可以将第二个循环改成如下代码:

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

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

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

int a[1001][1001];

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

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

        num++;  
        x++;     //a[2][0]  
        tol++;   
        a[x][y]=num;   

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

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

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-9 20:29:27 | 显示全部楼层
这是一个蛇形矩阵的生成程序,但是在数字到达10的时候就出现了问题,因为此时应该往左走而不是往上走。可以通过修改循环的条件来解决这个问题。以下是修改后的代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[1001][1001];
  4. int main()
  5. {
  6.     int n,k=1,looper,x=0,y=0,num=1,tol=0;;
  7.     cin>>n;
  8.     looper =n*n;
  9.     a[0][0]=1;
  10.     while(num<=looper)
  11.     {
  12.         num++;
  13.         y++;
  14.         tol++;
  15.         a[x][y]=num;
  16.         for(int i=0;i<tol-1;i++) // 修改循环条件
  17.         {
  18.             num++;
  19.             x++;
  20.             y--;
  21.             a[x][y]=num;
  22.         }
  23.         if(num > looper) break; // 添加判断条件
  24.         num++;
  25.         x++;
  26.         tol++;
  27.         a[x][y]=num;
  28.         for(int i=0;i<tol-1;i++)
  29.         {
  30.             num++;
  31.             x--;
  32.             y++;
  33.             a[x][y]=num;
  34.         }
  35.     }
  36.     for(int i=0;i<n;i++)
  37.     {
  38.         for(int j=0;j<n;j++)
  39.         {
  40.             cout<<a[ i][j]<<" ";
  41.         }
  42.         cout<<endl;
  43.     }
  44. }
复制代码


修改后的程序中,第一个for循环的条件变成了 for(int i=0;i<tol-1;i++) ,这是因为在第一次循环时已经将y加了1,所以后面的循环次数要减1。同时,在第二个for循环前添加了一个判断条件 if(num > looper) break; ,用来判断是否已经生成完整个矩阵,如果已经生成完毕,则跳出循环。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 04:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表