牛客蛇形矩阵
#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的时候就变为右上了,后面的值不对,应该怎么改呢,或者还有其他更好的解法,要有注释不然看不懂 请问您的问题是关于牛客网蛇形矩阵题目代码的修改,因为当计算到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:} 这是一个蛇形矩阵的生成程序,但是在数字到达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]