1. 程式人生 > >P1141 01迷宮-洛谷

P1141 01迷宮-洛谷

01迷宮

P1141 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; }