题目来源:
openjudge / WZOI
解题思路:
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 }