《二维数组回形遍历》题解(C++)

题目来源:

openjudge / WZOI

链接:https://wzoi.cc/s/1/183

解题思路:

1.确定某两个变量,同时指向【二维数组 arr[r][c]】中的某个坐标。

2.当【二维数组未被全部遍历】时,移动。

3.移动方向的确定:右→下→左→上。当碰壁[1]的时候改变方向。

[1]:“碰壁”的定义:当【下一坐标】的【行】和【列】其中一者为-1或【行】大于r,【列】大于c,或该坐标对应的另一【布尔二维数组】的值为false时,改变方向。

4.当【移动到新坐标】时,将相同大小的【布尔二维数组 Arr[r][c]】的值定位false,表示“已经来过了”。

变量一览:

int r,c,arr[100][100]={0};
bool Arr[100][100]={true};
int sumn=0,d=1,x=0,y=0;

r:行数

c:列数

arr:保存整数变量的二维数组。初始值为0。

Arr:用来判断是否已经遍历过的布尔数组。初始值为true(未遍历)。

sumn:已经遍历过的坐标数量

d:方向

  d=1:右         d=2:下          d=3:左          d=4:上

x:当前列

y:当前行

代码实现:

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int main()
 5 {
 6     int r,c,arr[100][100]={0};
 7     bool Arr[100][100]={true};
 8     cin>>r>>c;
 9     for(int i=0;i<r;i++)//输入数据
10         for(int o=0;o<c;o++)cin>>arr[i][o];
11     int sumn=0,d=1,x=0,y=0;
12     while(sumn<r*c)//当未完全遍历时
13     {
14         cout<<arr[y][x]<<endl;
15         Arr[y][x]=false;
16         //判断碰壁
17         if(((x+1==c||Arr[y][x+1]==false)&&d==1)||((y+1==r||Arr[y+1][x]==false)&&d==2)){
18             if(d==1)d=2;
19             else if(d==2)d=3;
20         } 
21         else if(((x==0||Arr[y][x-1]==false)&&d==3)||((y==0||Arr[y-1][x]==false)&&d==4)){
22             if(d==3)d=4;
23             else if(d==4)d=1;
24         } 
25         //移动
26         if(d==1)x++;
27         else if(d==2)y++;
28         else if(d==3)x--;
29         else if(d==4)y--;
30         sumn++;
31     }
32     return 0;
33 }

猜你喜欢

转载自www.cnblogs.com/wingtown/p/wzoi_P183_key_CPP.html