标题:这个程序哪里有问题,有好的见解吗?
只看楼主
Divine
Rank: 2
等 级:论坛游民
帖 子:18
专家分:11
注 册:2019-11-17
结帖率:80%
已结贴  问题点数:8 回复次数:9 
这个程序哪里有问题,有好的见解吗?
【题目02】蛇形矩阵(snake.cpp)wikioi1160
蛇形矩阵是一种御防性极强的魔法阵,其关键是讲魔法力最强的学员放在魔法阵的最里面,用数学方法来表示,即为取n行n列数字矩阵(其中n为不超过100的奇数),在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,如图所示为3行3列的蛇形矩阵,请输出该n行n列正方形矩阵以及矩阵对角线数字之和。
【输入格式】:
一个整数n(即n行n列)
【输出格式】:
n+1行,n行为组成的矩阵,最后一行为对角线数字之和。
【输入样例】:
3
【输出样例】:
5 4 3
6 1 2
7 8 9
25
程序代码:
#include<bits/stdc++.h> 
using namespace std;
int main(){
    int n,x,y;
    cin>>n;
    x=(n+1)/2,y=(n+1)/2;
    int a[50][50];
    int sx=1,num=1;
    a[x][y]=num;
    while(num<n*n) {
        num++;
        y++;
        a[x][y]=num;
        while(x>n/2-sx) {x--;num++;a[x][y]=num;}
        while(y>n/2-sx) {y--;num++;a[x][y]=num;}
        while(x<n/2+sx) {x++;num++;a[x][y]=num;}
        while(y>n/2+sx) {y++;num++;a[x][y]=num;}
        sx++;
    }
    y++;
    a[x][y]=num;
    for(register int i=1;i<=n;i++)
     {
         for(register int j=1;j<=n;j++)
          cout<<a[i][j]<<" ";
          cout<<endl;
     }
    return 0;
}
搜索更多相关主题的帖子: int 矩阵 数字 while num 
2020-03-01 15:28
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:4 
首先以3为例,模拟一下数组的移动方向
程序代码:
    int n, x, y;
    cin >> n;
    x = y = (n) / 2;
    int a[50][50]{{ 0 }};
    int sx = 1, num = 1;
    a[x][y] = num;
    while (num<n*n)
    {
        a[x][++y] = ++num;
        a[--x][y] = ++num;
        a[x][--y] = ++num;
        a[x][--y] = ++num;
        a[++x][y] = ++num;
        a[++x][y] = ++num;
        a[x][++y] = ++num;
        a[x][++y] = ++num;
    }

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

接着开始归纳
程序代码:
    int n, x, y;
    cin >> n;
    x = y = (n) / 2;
    int a[50][50]{{ 0 }};
    int sx = 1, num = 1;
    a[x][y] = num;
    while (num<n*n)
    {
        a[x][++y] = ++num;
        a[--x][y] = ++num;
        a[x][--y] = ++num;
        a[x][--y] = ++num;
        a[++x][y] = ++num;
        a[++x][y] = ++num;
        while (++y<n)
        a[x][y] = ++num;
        //a[x][++y] = ++num;
    }

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

运行无错后把能归纳的都归纳
程序代码:
    int n, x, y;
    cin >> n;
    x = y = (n) / 2;
    int a[50][50]{{ 0 }};
    int sx = 1, num = 1;
    a[x][y] = num;
    while (num<n*n)
    {
        a[x][++y] = ++num;
        a[--x][y] = ++num;
        while (--y>=0)
            a[x][y] = ++num; ++y;
        while (++x<n)
            a[x][y] = ++num; --x;
        while (++y<n)
            a[x][y] = ++num; --y;
    }

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

这样慢慢调试


[此贴子已经被作者于2020-3-1 17:08编辑过]

2020-03-01 17:07
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:2 
按照你的思路,应该是while里面套着一些if的结构,确保每次循环只有一个num++能够执行得到。
而不是while套着while

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-01 18:50
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:2 
另外,从外面倒着转进来其实简单一些。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-01 18:51
Divine
Rank: 2
等 级:论坛游民
帖 子:18
专家分:11
注 册:2019-11-17
得分:0 
回复 4楼 forever74
谢谢!!
2020-03-01 20:18
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 



[此贴子已经被作者于2020-3-2 03:51编辑过]

2020-03-02 03:38
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
最后优化一下代码,再弄一个旋转方向。





[此贴子已经被作者于2020-3-2 04:25编辑过]

2020-03-02 03:38
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
这叫螺旋矩阵吧,蛇形矩阵不是走斜线的那种吗?
运行了下楼主的代码,部分值显示为未初始化,应该是算法有问题。
这个题我记得以往我也是用数组解决的,还称其为“行程开关”算法,但我记得那次跟帖的一个高人是用纯数学计算解决的,可惜已经找不到那个贴了,百度了下,也没找到相关公式。不过我仍然想到一个不用数组的解决方法,只是效率较低:
程序代码:
#include <stdio.h>
int spiral(int n,int l)
{
    int i=0,sum=1,step=1,x0,y0,s,f[4][2]={-1,0,0,1,1,0,0,-1};
    x0=y0=(int)n/2;
    while (sum<=n*n)
    {
        s=0;
        while(s<step)
        {
            if(x0==l%n&&y0==l/n)return sum;
            x0+=f[i][0];
            y0+=f[i][1];
            sum++;
            s++;
        }
        i++;
        if(i&&!(i%2))step++;
        if(i>3)i=0;
    }
    return 0;
}

void main()
{
    int i,n=15;
    if(n<3||!(n%2))n=3;
    for(i=0;i<n*n;i++)
    {
        if(i&&!(i%n))printf("\n");
        printf("%5d",spiral(n,i));
    }
    printf("\n");
}

能编个毛线衣吗?
2020-03-02 09:25
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
之前写过不用数组的由外而内,其实由内而外也是一样道理。
2020-03-02 20:08
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
2020-03-03 09:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499489-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020823 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved