P1141 01迷宮-洛谷
阿新 • • 發佈:2019-01-11
01迷宮
題目描述
有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。
輸入輸出格式
輸入格式
第1行為兩個正整數n,m。
下面n行,每行n個字元,字元只可能是0或者1,字元之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的一個格子,詢問從這一格開始能移動到多少格。
輸出格式
m行,對於每個詢問輸出相應答案。
輸入輸出樣例
輸入樣例#1:
2 2
01
10
1 1
2 2
輸出樣例#1:
4
4
說明
所有格子互相可達。
對於20%20%的資料,n≤10;
對於40%40%的資料,n≤50;
對於50%50%的資料,m≤5;
對於60%60%的資料,n≤100,m≤100;
對於100%100%的資料,n≤1000,m≤100000。
解析
經典BFS題目,注意進行下一步的要求是與下一步的數字不同即可.
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<stdlib.h>
using namespace std;
int t = 1,ans=0, n, dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
char map[1001][1001];
int val[1001][1001],a[1000001];
struct vec {
int x, y;
}p;
int main()
{
int m;
cin >> n >> m;
for ( int i = 0; i < n; i++)
cin >> map[i];
queue<struct vec>q;
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++)
if (val[i][j] == 0) {
p.x = i, p.y = j;
q.push(p);
ans++;
val[i][j] = t;
while (q.size() != 0) {
p = q.front(); q.pop();
for (int k = 0; k < 4; k++){
vec ip = p;
ip.x = dx[k] + p.x, ip.y = p.y + dy[k];
if (!val[ip.x][ip.y]&& ip.x >= 0 && ip.x < n&&ip.y < n&&ip.y >= 0 && (map[p.x][p.y] != map[ip.x][ip.y])) {
val[ip.x][ip.y] = t;
ans++;
q.push(ip);
}
}
}
a[t] = ans;
ans = 0;
t++;
}
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d %d",&x,&y);
cout << a[val[x-1][y-1]] << endl;
}
return 0;
}