数字漩涡
比赛题目
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
分数:100
描述
小星一不小心变成了一名海盗🏴☠️,作为海盗的小星在漫无边际的大海中航行,说不定就会碰到一个神秘的小岛,神秘小岛中说不定会有神秘的宝藏,有一天正在行驶中的小星,不小心掉到了一个神奇的漩涡,这个漩涡是有数字组成,只有解出数字漩涡,才能逃离,要不然就会被数字漩涡吞噬掉。
数字漩涡规则如下:
数字漩涡是由 n 到 m 之间的数字组成(包含 n 和m )
数字漩涡的中心从 n 开始,下一个数字出现在数字漩涡中心的正下方,数字逆时针方向增加,直到最后一个数字被打印出来。
输入描述
一行分别输入 n 和 m(1<=m<=n<100)
输出描述
每一个输出按照2个字符的宽度、左对齐的输出格式,输出数字漩涡,并且每个输出之间都以一个空格分开。
用例输入
10 27
用例输出
27 26
16 15 14 25
17 10 13 24
18 11 12 23
19 20 21 22
#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main()
{
int n,i,j,k,d,a[51][51];
cin>>n;
for(i=0;i<=n+1;i++)
for(j=0;j<=n+1;j++) a[i][j]=-1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) a[i][j]=0;
i=1;j=1;d=0;
for(k=1;k<=n*n;k++)
{
a[i][j]=k;
if(a[i+dx[d]][j+dy[d]]!=0) d=(++d)%4;
i=i+dx[d];
j=j+dy[d];
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
return 0;
}
请问哪里错了
没看到输入并使用 m。你的程序是根据 n 从外向内顺时钟漩入。dx 和 dy 交换一下。参考以下程序:
#include<bits/stdc++.h>
#define N 51
using namespace std;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int main()
{
int n,m,i,j,k,d=0,a[N][N];
for(i=0;i<N;i++)
for(j=0;j<N;j++) a[i][j]=0;
int mini=N,minj=N,maxi=0,maxj=0;
cin>>n>>m;
i=N/2,j=N/2;
for(k=n;k<=m;k++)
{
// cout<<i<<","<<j<<" d:"<<d; //输出调试时的下标、d值
a[i][j]=k;
if(a[i+dx[d]][j+dy[d]]==0) {
i = i + dx[d];
j = j + dy[d];
d = (++d) % 4;
} else {
i = i + dx[d==0?3:d-1];
j = j + dy[d==0?3:d-1];
}
// cout<<" next:"<<i<<","<<j<<endl; //输出下一个数的下标
if(i<mini) mini=i;
if(j<minj) minj=j;
if(i>maxi) maxi=i;
if(j>maxj) maxj=j;
}
for(i=mini;i<=maxi;i++){
for(j=minj;j<=maxj;j++) {
k = j == minj ? 2 : 3;
cout << setw(k) << (a[i][j] == 0 ? " " : to_string(a[i][j]));
}
cout<<endl;
}
return 0;
}
输入10 30,输出
30 29 28 27 26
16 15 14 25
17 10 13 24
18 11 12 23
19 20 21 22
该回答引用GPT
//这份代码是一个普通的螺旋矩阵生成代码,与题目要求的数字漩涡不符。正确的数字漩涡生成代码可以参考以下代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[100][100] = {0};
int x = n, y = n, num = 1;
a[x][y] = num++;
while (num <= (m - n + 1) * (m - n + 1)) {
while (a[x][y - 1] == 0 && y > n) a[x][--y] = num++;
while (a[x + 1][y] == 0 && x < m) a[++x][y] = num++;
while (a[x][y + 1] == 0 && y < m) a[x][++y] = num++;
while (a[x - 1][y] == 0 && x > n) a[--x][y] = num++;
}
for (int i = n; i <= m; i++) {
for (int j = n; j <= m; j++) {
cout << setw(2) << a[i][j] << " ";
}
cout << endl;
}
return 0;
}