标签:str 程序 部分 open click style ack getchar 必须
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n×n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
第一行为整数n(n≤1000),下面是一个n×n的0、1矩阵,表示海洋地图;
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
3
001
101
100
1 1 3 3
4
因为是船,所以自然就只能在海上行驶,即只能在值为0的上走,所有是需要对图遍历一次,很明显是搜搜索题。
这题表面上看起来数据大,但实际上用BFS的话只需要n方的时间复杂度,只要注意好不要走重复的点就好。
#include <iostream> #include <cstdio> #include <queue> #define MAX_N 1000 using namespace std; int n; int sx, sy, tx, ty; const int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1}; int f[MAX_N | 1][MAX_N | 1]; queue<int> qx, qy; int main() { scanf("%d", &n); char ch; for(register int i = 1; i <= n; ++i) { getchar(); for(register int j = 1; j <= n; ++j) { ch = getchar(); f[i][j] = (ch == ‘1‘); } } scanf("%d%d%d%d", &sx, &sy, &tx, &ty); int cnt = 0, x, y; qx.push(sx); qy.push(sy); f[sx][sy] = 1; while(!qx.empty()) { for(register int I = qx.size(); I; --I) { x = qx.front(); y = qy.front(); qx.pop(); qy.pop(); if(x == tx && y == ty) return printf("%d", cnt), 0; for(register int i = 0; i < 4; ++i) { if(x + dx[i] < 1 || x + dx[i] > n || y + dy[i] < 0 || y + dy[i] > n) continue; if(f[x + dx[i]][y + dy[i]]) continue; f[x + dx[i]][y + dy[i]] = 1; qx.push(x + dx[i]); qy.push(y + dy[i]); } } ++cnt; } return 0; }
标签:str 程序 部分 open click style ack getchar 必须
原文地址:https://www.cnblogs.com/kcn999/p/10284339.html