二维数组回形遍历
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示:
输入
输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出
按遍历顺序输出每个整数。每个整数占一行。
样例输入
4 4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
样例输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
示例代码
此处展示以DFS模型思想为基础的模拟型搜索,为最容易想到的思路。
本代码较为冗长,但是思路较为清晰,大致就为将所有点遍历完结束至输出完毕。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
bool flag[105][105];
int n[105][105];
int num=a*b-1;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
cin>>n[i][j];
}
}
for(int i=0;i<=a+1;i++){
flag[i][0]=true;
flag[i][b+1]=true;
}
for(int i=0;i<=b+1;i++){
flag[0][i]=true;
flag[a+1][i]=true;
}
int x=1;
int c=1;
int d=1;
cout<<n[1][1]<<endl;
flag[1][1]=true;
while(num>=1){
if(x==1&&flag[c][d+1]==false){
cout<<n[c][d+1]<<endl;
d+=1; //X=1 向右移动
flag[c][d]=true;
num--;
}else if(x==1&&flag[c][d+1]!=false){
x=-2;//X=-2 向下移动
}else if(x==-1&&flag[c][d-1]==false){
cout<<n[c][d-1]<<endl;
d-=1;
flag[c][d]=true;
num--;
}else if(x==-1&&flag[c][d-1]!=false){
x=2;//X=2 向上移动
}else if(x==-2&&flag[c+1][d]==false){
cout<<n[c+1][d]<<endl;
c+=1;
flag[c][d]=true;
num--;
}else if(x==-2&&flag[c+1][d]!=false){
x=-1;//X=-1 向左移动
}else if(x==2&&flag[c-1][d]==false){
cout<<n[c-1][d]<<endl;
c-=1;
flag[c][d]=true;
num--;
}else if(x==2&&flag[c-1][d]!=false){
x=1;
}
}
return 0;
}