解题思路:
1.两个二维数组,一个用来记录矩阵,另一个用bool型,记录是否访问同时也能形成新的墙壁;
2.分成四个方向,每个方向碰壁后就停止,停止后切换下一个方向;
3.碰壁判断是下一个超出矩阵或者下一个bool数组是墙壁;
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int r, c, arr[100][100] = { 0 };
bool Arr[100][100] = { true };
cin >> r >> c;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)Arr[i][j] = true;
for (int i = 0; i < r; i++)//输入数据
for (int j = 0; j < c; j++)cin >> arr[i][j];
int sumn = 0, d = 1, x = 0, y = 0;//sumn判断是否全部遍历,d控制方向,x.y用来访问
while (sumn < r c)//当未完全遍历时
{
cout << arr[y][x] << endl;
Arr[y][x] = false;
//判断碰壁
if ( ( (x + 1 == c || Arr[y][x + 1] == false) && d == 1)
/*当右移的时候,要么是到达了整个矩阵的最右边,或者是再右移就碰到了已经访问过的元素了*/
|| ( (y + 1 == r || Arr[y + 1][x] == false) && d == 2) )
{
if (d == 1)d = 2;
else if (d == 2)d = 3;
}
else if (((x == 0 || Arr[y][x - 1] == false) && d == 3) || ((y == 0 || Arr[y - 1][x] == false) && d == 4)) {
if (d == 3)d = 4;
else if (d == 4)d = 1;
}
//移动
if (d == 1)x++;//右移
else if (d == 2)y++;//下移
else if (d == 3)x--;//左移
else if (d == 4)y--;//上移
sumn++;
}
return 0;
}