Description
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,输出矩阵中的所有元素。
Input
第一行两个整数m, n。 (1≤ m, n ≤100)
第二行开始是一个m行n列的矩阵,每行的两个数之间由空格隔开。
Output
按照顺时针螺旋顺序,输出矩阵中的所有元素,两个数之间由空格隔开。
Sample Input
3 3 1 2 3 4 5 6 7 8 9
Sample Output
1 2 3 6 9 8 7 4 5
1 #include<iostream> 2 //#include<fstream> 3 using namespace std; 4 int a[103][103]; 5 int book[200][230]; 6 int dir[5][2]={0,1,1,0,0,-1,-1,0};//用于转向的数组 7 int main(){ 8 int m,n; 9 // fstream file("haha.txt"); 10 // file>>m>>n; 11 cin>>m>>n; 12 for(int i=1;i<=m;i++){ 13 for(int j=1;j<=n;j++){ 14 // file>>a[i][j]; 15 cin>>a[i][j]; 16 } 17 } 18 int dx=1,dy=0,i=0;//dx,dy为初始的位置 19 int num=m*n,sum=0;//num是数组中所有元素的数量 20 while(1){ 21 dx+=dir[i%4][0]; 22 dy+=dir[i%4][1];//a[dx][dy]已经移动到了下个位置 23 if(dx>=1&&dx<=m&&dy>=1&&dy<=n&&!book[dx][dy]){//如果下个位置没有超过范围,并且没有到达过 24 cout<<a[dx][dy]<<" ";//就输出这个位置的元素 25 sum++;//输出元素加1,当输出元素的数量达到元素总数的时候,跳出循环 26 book[dx][dy]=1;//输出这个位置后,就标记这个位置 27 } 28 else{//如果下个位置超过了范围或者下个位置是标记过的 29 dx-=dir[i%4][0]; 30 dy-=dir[i%4][1];//就先退回一步 31 i+=1;//i加1后,用与转换位置的数组dir就变了 32 dx+=dir[i%4][0]; 33 dy+=dir[i%4][1];//变换方向后的下一步 34 cout<<a[dx][dy]<<" ";//输出 35 book[dx][dy]=1;//标记 36 sum++;// 输出元素加1 37 } 38 if(sum==num) 39 break;//如果输出元素总数等于元素总数,跳出循环 40 } 41 return 0; 42 }