输入样例:
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
代码:
#include <iostream>
#include <vector>
using namespace std;
int dxy[][2] = { {0,1},{1,-1},{1,0},{ -1,1 } }; //偏移量数组
int main()
{
int n;
cin >> n;
vector<vector<int>>map(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> map[i][j];
int count = 0; //记数
int t = 0; //用于偏移量数组
int x = 1, y = 1;
cout << map[x][y] << " "; //先将第一个位置的数字输出
count++; //计数+1
while (count < n * n) //当 计数等于n*n时结束循环
{
int xx = x + dxy[t][0]; //把坐标更新
int yy = y + dxy[t][1];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= n&&map[xx][yy]) //先判断坐标合不合法,再判断该位置有没有走过
{
x = xx; y = yy; //将更新后的坐标赋值给x,方便在x基础上更新坐标
cout << map[x][y] << " "; //输出该坐标的数
map[x][y] = 0; //将该坐标标记为0,意味着走过
count++;
if (t == 0 || t == 2) //当前向右(t=0)以及向下(t=2)时意味着接下来该左下或右上
t++;
}
else { //当越界或该位置已经走过时,改变朝向
t = (t + 1) % 4;
}
}
return 0;
}
这里为什么一定要将走过的标记为0以及判断有没有走过?
3坐标是7,如果你不加判断有没有走过,则会从7往右上走,也就是从7->4,而不是从7->3了。你本就是从4->7,紧接着应该从7->3,如果不加判断,则变成4->7,7->4了,也就是又回去走重复了。