请问我的代码哪里错了

数字漩涡
比赛题目
时间限制: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
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7695182
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

该回答引用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;
}