注册 登录
编程论坛 C++教室

别人出的一道题(数字螺旋阵排版问题)

wonderfulday 发布于 2004-07-29 19:37, 2827 次点击

打印出具有下列规律的矩阵图

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

[此贴子已经被kai于2004-07-30 23:56:51编辑过]

12 回复
#2
jzh20042004-07-30 18:52
螺旋矩阵,这些基础问题你应该到C语言教室去讨论
#3
kuangjingbo2004-07-30 20:19

哇,楼上的你挖墙角!哼,不厚道!!

楼主:方法很多,给你一个比较笨的方法:

void main()

{

int i,j;

int array[][5]={{1,2,3,4,5},{16,17,18,19,6},{15, 24 ,25, 20 ,7},{14 ,23 ,22, 21, 8},{13, 12, 11, 10, 9}};

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<<array[i][j]<<" ";

cout<<endl;

}

}

#4
kai2004-07-30 23:15

2 楼的确有挖墙脚的味道,我已经好久没在C 语言板块发言了,为的就是坚守C++ 阵地。

C++ 板块要做好,靠的就是大家来提供好的程序代码。

C, C++ 没有实际意义上的界限。当然C, C++ 的思维方式是不一样的。

言归正传,这道题是关于数字螺旋式布阵,并打印出来的问题。它可以扩展为 N * N 的阵型。记得以前做过,并在C 语言板块给出了答案,不过我找了一下,没有找到。我也没有耐心一个一个去找了。

我想一下,有了答案再给大家。

#5
wonderfulday2004-07-30 23:31

#include<stdio.h> #include<iostream.h>

#define SIZE 8 #define ALL SIZE*SIZE

static int x;

class round{ public: char point; int i; void set_r(){point='r';} void set_d(){point='d';} void set_l(){point='l';} void set_u(){point='u';}

};

round a[SIZE][SIZE];

main() { int i,k,j; for(i=0;i<SIZE/2;i++){ a[i][i].set_r(); a[i+1][i].set_r(); a[SIZE-i-1][SIZE-i-1].set_l(); a[SIZE-i-1][i].set_u(); a[i][SIZE-i-1].set_d(); }

x=1; i=0; j=0; do{ while(a[i][j].point=='r'||a[i][j].point==NULL){ a[i][j].i=x; x++; j++; } while(a[i][j].point=='d'||a[i][j].point==NULL){ a[i][j].i=x; x++; i++; } while(a[i][j].point=='l'||a[i][j].point==NULL){ a[i][j].i=x; x++; j--; } while(a[i][j].point=='u'||a[i][j].point==NULL){ a[i][j].i=x; x++; i--; }

}while(x!=ALL+1);

for(i=0;i<SIZE;i++){ for(k=0;k<SIZE;k++){ printf("%4d",a[i][k].i); } printf("\n"); }

return 0; }

#6
wonderfulday2004-07-30 23:34

我做了很久,我知道这不是一个好的方法

也有错,就是不能显示奇数的矩阵,望高手指点

#7
kai2004-07-31 02:32

#include <iostream> #include <cstdlib> #include <cstring> #include <iomanip> using namespace std;

int main() { const int MAX = 20; int i = 0, j = 0; int N = 0; int num[MAX][MAX]; for(; i<MAX; i++) memset(&num[i][0], 0, MAX*sizeof(int)); cout<<"Please set the N value for a N*N place\n"; cout<<"N = "; cin>>N; int max = N*N; int number = 1; i = 0; j = 0; num[i][j] = number; bool rand = true;; bool forwards = true; bool down = false; bool back = false; bool up = false;

while(number<max) { if(forwards) { j++; if(num[i][j] == 0) { number++; num[i][j] = number; if(num[i][j+1]||number==N) { forwards = false; down = true; } } } else if(down) { i++; if(num[i][j] == 0) { number++; num[i][j] = number; if(num[i+1][j]||number==2*N-1) { down = false; back = true; } } } else if(back) { j--; if(num[i][j] == 0) { number++; num[i][j] = number; if(j == 0||num[i][j-1]||number==3*N-2) { back = false; up = true; } } } else if(up) { i--; if(num[i][j] == 0) { number++; num[i][j] = number; if(num[i-1][j]) { up = false; forwards = true; } } } } for(i = 0; i<N; i++) { for(j = 0; j<N; j++) { cout.width(3); cout<<setiosflags(ios::left); cout<<num[i][j]<<" "; } cout<<endl; } system("pause"); return 0; }

#8
jzh20042004-07-31 09:06

呵呵,我没有挖墙角的意思,只是我觉得这种主要是算法的问题,用不到C++的类啊,继承啊等等特性,用C就足够了。

因为一般算法书上都是C语言啊,我没有别的意思啊,不要打我啊

#9
kai2004-07-31 09:59

jzh2004,

欢迎你来C++ 板块,说你挖墙脚,只是一句玩笑话阿,不必挂在心上。C板块比C++板块热闹的多,大家都是看到的。我想这与学习C语言的人比较多有关。不过随着论坛的人越来越多起来,C++板块也会越来越热闹起来的。

说到算法,我不能同意你的观点。我认为,算法是独立于任何一门语言的解题思路,C 需要算法,C++ 也需要算法,java 也不能没有算法,其余的语言的也同样需要算法。

只是,C, C++他们的思维方式不同罢了。C++ 区别于C主要是因为C++ 提供的OOP 机制。 在OOP 方面,Java更向前走了一步。OOP 提出了这么一个思想,任何一类Object 都有其专有的特性,另外其应该有作用于其他对象,以及其他对象作用于他的方法。那么我们就可以通过创建对象来模拟事务的进程。

如果你用java 编程,却依然是过程化编程,那么这肯定是不好的习惯。但还是有很多人会写出过程化的程序。这点在C++ 编程中尤为普遍,原因是什么?因为太多的朋友是先学了C, C过程化编程的思想对他影响太大。我并没有批评或指责C的意思。我只是要强调C,C++ 有着他们不同的思维方式。

这里由于是C++板块,我尽量追求C++的风格。当然有朋友来求C风格的代码,一样是可以的。C++ 本身也并非完全是OOP 编程语言。

#10
jzh20042004-07-31 12:31

哈哈,我知道是开玩笑啦,你说的不错啊,我C用的太久了,C++也生疏了,我以后会多用面向对象的方法来思考,以后还要多向你们学习啊

#11
kai2004-07-31 12:46
你太客气了,大家互相学习。
#12
kuangjingbo2004-08-01 20:57

算法让我想起了古代的锦囊。到哪一步,打开哪个锦囊,里面都写的清清楚楚该怎么做。不到某个时候,是千万不能打开某个锦囊的。

而语言就是来描述“锦囊”的,比如诸葛亮写锦囊的方法肯定跟周瑜不一样!

瞎侃一通,见笑!

#13
瓦药墙2010-04-25 23:01
程序代码:

#include <stdio.h>
int main(void)
{
    static int var[50][50]={0};
    int i, j, k, tem=1, l;
    printf("输入一个正整数\n");
    scanf("%d", &k);

    for(l=0; l<k/2+1; l++)
    {
        //首行
        for(i=l; i<k-l; i++)
        {
            var[l][i]=tem; //var[0][0到4] var[1][1到3] var[2][2]
            tem++;
        }
        tem--;
        //尾列
        for(i=l; i<k-l; i++)
        {
            var[i][k-l-1]=tem; //var[0到4][4] var[1到3][3] var[2][2]
            tem++;
        }
        tem--;
        //尾行
        for(i=l; i<k-l; i++)
        {                          //i 0到4       1到3          2到2
            var[k-l-1][k-i-1]=tem; //var[4][4到0] var[3][3到1] var[2][2]
            tem++;
        }
        tem--;
        //首列
        for(i=l; i<k-l-1; i++)
        {
            var[k-1-i][l]=tem; //var[4到0][0] var[3到1][1] var[2][2]
            tem++;
        }
    }
    for(i=0; i<k; i++)
    {
        for(j=0; j<k; j++)
            printf("%4d", var[i][j]);
        printf("\n");
    }
    return 0;
}

qq:413306776
c语言讨论qq群:
111677131
33505437

[ 本帖最后由 瓦药墙 于 2010-4-25 23:02 编辑 ]
1