武汉科技大学ACM:1008: 零起点学算法64——回型矩阵
Problem Description
输出n*m的回型矩阵
Input
多组测试数据
每组输入2个整数 n和m(不大于20)
Output
输出n*m的回型矩阵,要求左上角元素是1,(每个元素占2个位置,靠右)
Sample Input
4 3
Sample Output
1 2 3 10 11 4 9 12 5 8 7 6
1 #include<iostream> 2 #include<string.h> 3 #include<iomanip> 4 using namespace std; 5 int main() 6 { 7 int m,n,i,j,k,lastX,lastY; 8 while(cin>>m>>n) 9 { 10 int **a=new int*[m]; 11 for(i=0;i<m;i++) 12 { 13 *(a+i)=new int[n]; 14 memset(a[i],0,n*sizeof(int)); 15 } 16 i=0,j=0,k=0; 17 int state=0;//0 为从左到右赋值,1为从上到下,2为从右到左,3为从下到上 18 while(k<m*n) 19 {//要赋值m*n次 20 switch(state) 21 { 22 case 0: 23 for(;j<n;++j) 24 { 25 if(a[i][j]==0) 26 { 27 a[i][j]=k+1; 28 ++k; 29 lastX=i; 30 lastY=j;//记录下一次赋值开始位置 31 } 32 } 33 i=lastX+1; 34 j=lastY; 35 state=1; 36 break; 37 case 1: 38 for(;i<m;++i) 39 { 40 if(a[i][j]==0) 41 { 42 a[i][j]=k+1; 43 ++k; 44 lastX=i; 45 lastY=j; 46 } 47 } 48 i=lastX; 49 j=lastY-1; 50 state=2; 51 break; 52 case 2: 53 for(;j>=0;--j) 54 { 55 if(a[i][j]==0) 56 { 57 a[i][j]=k+1; 58 ++k; 59 lastX=i; 60 lastY=j; 61 } 62 } 63 i=lastX-1; 64 j=lastY; 65 state=3; 66 break; 67 case 3: 68 for(;i>=0;--i) 69 { 70 if(a[i][j]==0) 71 { 72 a[i][j]=k+1; 73 ++k; 74 lastX=i; 75 lastY=j; 76 } 77 } 78 i=lastX; 79 j=lastY+1; 80 state=0; 81 break; 82 default: 83 break; 84 } 85 86 } 87 88 for(i=0;i<m;i++) 89 { 90 for(j=0;j<n;j++) 91 if(j==0) 92 { 93 cout<<setw(2)<<a[i][j]; 94 } 95 else 96 { 97 cout<<setw(3)<<a[i][j]; 98 } 99 cout<<endl; 100 delete []a[i]; 101 } 102 delete []a; 103 104 } 105 return 0; 106 }