鱼C论坛

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

[已解决]牛客蛇形矩阵

[复制链接]
发表于 2023-10-9 20:28:38 | 显示全部楼层 |阅读模式
1鱼币
#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;i++)
        {
            num++;
            x++;
            y--;
            a[x][y]=num;  //a[1][0]
        }
        num++;
        x++;              //a[2][0]
        tol++;    
        a[x][y]=num;
        for(int i=0;i<tol;i++)
        {
            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;

    }
    
    
    
}
我发现到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. ...
想知道小甲鱼最近在做啥?请访问 -> 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]

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

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-9 20:29:27 | 显示全部楼层
这是一个蛇形矩阵的生成程序,但是在数字到达10的时候就出现了问题,因为此时应该往左走而不是往上走。可以通过修改循环的条件来解决这个问题。以下是修改后的代码:
#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++;
        y++;
        tol++;
        a[x][y]=num;
        for(int i=0;i<tol-1;i++) // 修改循环条件
        {
            num++;
            x++;
            y--;
            a[x][y]=num;
        }
        if(num > looper) break; // 添加判断条件
        num++;
        x++;
        tol++;
        a[x][y]=num;
        for(int i=0;i<tol-1;i++)
        {
            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;
    }
}

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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