螺旋矩阵

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 }

 





上一篇:漫步校园 杭电1428


下一篇:HDU1312 Red and Black (BFS&&queue)