本文主要是介绍Acwing-3208. Z字形扫描,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
输入样例:
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++; //计数+1while (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了,也就是又回去走重复了。
这篇关于Acwing-3208. Z字形扫描的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!