【GMOJ 1403】【Vijos 1468】 渡河

題目大意:

傳說中教主乃世外高人,不屑於參加OI競賽,於是雲遊四方,威風八面。只不過教主行蹤不定,就像傳說中的神獸一樣可遇而不可求。小L和小H爲了求得教主簽名的Orz教主T-Shirt,打算碰碰運氣展開了冒險。在冒險中,他們不幸被突來的洪水衝到了一個神祕叢林中,他們想盡快逃出這個地方。小L找到了一張看似爲曾經的冒險者遺棄的地圖,但經過探查,地圖所示的確實是這片叢林。小L從地圖上看到,有衆多河流穿過這片叢林,等到他接近一條最近的河流時,發現水流較急,且河水很深,小H不擅長游泳,所以他們決定利用叢林中的樹木做一隻竹筏渡河。

雖然竹筏做好後可以在這一條河所連通的水域任意行進,但是竹筏在上岸後必須拋棄,若想再次渡河必須再做一次竹筏,但這畢竟是十分辛苦的,他們希望做竹筏也就是渡河的次數儘量少,就求助於你。

地圖上的陸地和河流可以抽象成一個n*n由數字0和1組成的矩陣,其中0代表陸地,1代表河流。無論在陸地上還還是河流上,他們都可以向相鄰8格(邊相鄰或角相鄰)移動,但是若要從陸地進入河流(也就是從0到1),則必須製作竹筏。若到達地圖邊界則順利逃脫。但是小T和小K有可能迷路,所以會多次詢問你,對於每次詢問,只要輸出到達地圖邊界需要的最少渡河次數即可,保證每次詢問都是指向陸地。

小L和小H翻到地圖的反面,赫然發現六個大字:“教主到此一遊”!兩人無法抑制自己激動的心情,將這張地圖珍藏起來。據說後來這張圖成爲無價之寶。

解題思路:

陸地和河流分層bfs求出每個點到邊的渡河次數

Accepted code:Accepted\ code:

#include<cstdio>
#include<iostream>

using namespace std;

const int N = 1005;
const int M = 1000005; 
const int dx[8] = {0, 0, 1, -1, 1, -1, 1, -1};
const int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};

int n, q;
char c[N][N];
int a[N][N], v[N][N], sx[M], sy[M], sx1[M], sy1[M], cost[N][N];

inline int read() {
	int f = 0; char c = getchar();
	while (!isdigit(c)) c = getchar();
	while (isdigit(c)) f = f * 10 + c - 48, c = getchar();
	return f;
}

bool check(int x, int y) {
	return v[x][y] || x < 0 || y < 0 || x > n + 1 || y > n + 1;
}

void find() {
	int h1 = 2, t1 = 1;
	while (t1) {
		int t = t1, h = 0; t1 = 0;
		while (h <= t) {
			++h;
			for (int i = 0; i < 8; ++i) {
				int x = sx[h] + dx[i];
				int y = sy[h] + dy[i];
				if (check(x, y)) continue;
				v[x][y] = 1;
				if (a[x][y] == a[sx[1]][sy[1]])
					sx[++t] = x, sy[t] = y, cost[x][y] = h1; else
					sx1[++t1] = x, sy1[t1] = y, cost[x][y] = h1 + 1;
			}
		}
		++h1;
		for (int i = 0; i <= t1; ++i)
			sx[i] = sx1[i], sy[i] = sy1[i];
	}
}

int main() {
	n = read(), q = read();
	for (int i = 1; i <= n; ++i)
		scanf("%s", c[i] + 1);
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			a[i][j] = c[i][j] - 48;
	find();
	for (int i = 1; i <= q; ++i) {
		int x = read(), y = read();
		printf("%d ", (cost[x][y] >> 1) - 1);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章