打印出具有下列规律的矩阵图
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编辑过]
2 楼的确有挖墙脚的味道,我已经好久没在C 语言板块发言了,为的就是坚守C++ 阵地。
C++ 板块要做好,靠的就是大家来提供好的程序代码。
C, C++ 没有实际意义上的界限。当然C, C++ 的思维方式是不一样的。
言归正传,这道题是关于数字螺旋式布阵,并打印出来的问题。它可以扩展为 N * N 的阵型。记得以前做过,并在C 语言板块给出了答案,不过我找了一下,没有找到。我也没有耐心一个一个去找了。
我想一下,有了答案再给大家。
#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; }
#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; }
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 编程语言。