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 }