1:如下,是一个“4×4”的数字矩阵,请找出其中的规律,然后编写一个程序,要求能打印出“N×N”时的数字矩阵:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
请用自己最熟悉的语言编写,或者用自然语言描述。至少要包括下列内容:
1: 数字矩阵的规律
2: 采用的数据结构
3:关键的控制流程
#include<iostream> #include<cmath> #define N 4 using namespace std; int main() { int i,j; int count=0; int a[N][N]; for(i=0;i<N/2;i++) { for(j=i;j<N-i-1;j++) a[i][j]=++count; for(j=i;j<N-i-1;j++) a[j][N-i-1]=++count; for(j=i;j<N-i-1;j++) a[N-i-1][N-1-j]=++count; for(j=i;j<N-i-1;j++) a[N-1-j][i]=++count; } if(N%2!=0) a[N/2][N/2]=++count; for(i=0;i<N;i++) { for(j=0;j<N;j++) cout<<a[i][j]<<ends; cout<<endl; } return 0; }
下面这个是自己写的
#include<iostream> #include <map> const int N = 10; const int MaxMap = 100; using namespace std; enum { Right = 0, Dowm = 1, Left = 2, Up = 3 }; int GetValue(int x,int y) { int nValue = x+y*MaxMap; return nValue; } void Move(int Num,int &x,int &y) { switch (Num%4) { case Right: x++; break; case Dowm: y++; break; case Left: x--; break; case Up: y--; break; } } void FillMap(map <int,int> &MapPonit) { int Now_x=1,Now_y=1; //当前坐标 int Next_x=1,Next_y =1; //下一步的坐标 int Num = 0; for(int i=1;i<=N*N;i++) { // 转弯有二种情况,1.下一个点已经走过,2.一个方向上走到最大值N if(((i-1)%(N-1)==0&&Num<3&&2<i)) Num++; if(MapPonit.find(GetValue(Next_x,Next_y)) == MapPonit.end()) { Now_x = Next_x; Now_y = Next_y; } else { Num++; Move(Num,Now_x,Now_y); Next_x = Now_x; Next_y = Now_y; } //根据value值保存所有走过的点 Move(Num,Next_x,Next_y); MapPonit[GetValue(Now_x,Now_y)] = i; } } void Print(map <int,int> MapPonit) { map <int,int>::iterator itr = MapPonit.begin(); int NCout = 0; for(itr;itr!=MapPonit.end();itr++) { if(NCout%N == 0) cout<<endl; int nStep = itr->second; if(nStep<10) cout<<0; cout<<nStep<<" "; NCout++; } } int main() { map <int,int> MapPonit; FillMap(MapPonit); Print(MapPonit); getchar(); return 0; }