P1141 01迷宮(BFS)
阿新 • • 發佈:2019-01-01
題目描述
有一個僅由數字00與11組成的n \times nn×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰44格中的某一格11上,同樣若你位於一格1上,那麼你可以移動到相鄰44格中的某一格00上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。
輸入輸出格式
輸入格式:
第11行為兩個正整數n,mn,m。
下面nn行,每行nn個字元,字元只可能是00或者11,字元之間沒有空格。
接下來mm行,每行22個用空格分隔的正整數i,ji,j,對應了迷宮中第ii行第jj列的一個格子,詢問從這一格開始能移動到多少格。
輸出格式:
mm行,對於每個詢問輸出相應答案。
輸入輸出樣例
輸入樣例#1: 複製
2 2
01
10
1 1
2 2
輸出樣例#1: 複製
4
4
說明
所有格子互相可達。
對於20\%20%的資料,n≤10n≤10;
對於40\%40%的資料,n≤50n≤50;
對於50\%50%的資料,m≤5m≤5;
對於60\%60%的資料,n≤100,m≤100n≤100,m≤100;
對於100\%100%的資料,n≤1000,m≤100000n≤1000,m≤100000。
聯通塊思想,即這這個方塊當中它們能移動的格子是相同的,所以我們就可以設一個數組記憶,已經搜尋過,就無需再一次搜尋了。
BFS
#include<bits/stdc++.h> #define M 1010 using namespace std; struct node { int x,y; }; char maze[M][M]; int n,m,k,vis[M][M],by[M*M]; int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; bool check(node dd,int x,int y) { if (1<=x && x<=n && 1<=y && y<=n && maze[x][y]!=maze[dd.x][dd.y] && !vis[x][y]) return 1; else return 0; } int bfs(node dd) { int s = 1; queue<node> q; vis[dd.x][dd.y] = k; q.push(dd); while (!q.empty()) { node md = q.front(); q.pop(); for (int i=0;i<4;i++) { int ddx = md.x + dx[i]; int ddy = md.y + dy[i]; if (check(md,ddx,ddy)) { s++; node zz; vis[ddx][ddy] = k; zz.x = ddx,zz.y = ddy; q.push(zz); } } } return s; } int main() { //freopen("in.txt","r",stdin); int i,j; cin>>n>>m; for (i=1;i<=n;i++) for (j=1;j<=n;j++) cin>>maze[i][j]; for (i=0;i<m;i++) { node dd; cin>>dd.x>>dd.y; if (by[vis[dd.x][dd.y]]) cout<<by[vis[dd.x][dd.y]]<<endl; else { k++; by[k] = bfs(dd); cout<<by[k]<<endl; } } return 0; }
DFS
#include<bits/stdc++.h>
#define M 1010
using namespace std;
struct node
{
int x,y;
};
char maze[M][M];
int n,m,k,ans,vis[M][M],by[M*M];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
bool check(node dd,int x,int y)
{
if (1<=x && x<=n && 1<=y && y<=n &&
maze[x][y]!=maze[dd.x][dd.y] && !vis[x][y])
return 1;
else return 0;
}
void dfs(node dd)
{
ans++;
vis[dd.x][dd.y] = k;
for (int i=0;i<4;i++)
{
int ddx = dd.x + dx[i];
int ddy = dd.y + dy[i];
if (check(dd,ddx,ddy))
{
node zz;
zz.x = ddx,zz.y = ddy;
dfs(zz);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
node dd;
int i,j;
cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
cin>>maze[i][j];
k = ans = 0;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (!vis[i][j])
{
k++;
dd.x = i,dd.y = j;
dfs(dd);
by[k] = ans;
ans = 0;
}
}
for (i=0;i<m;i++)
{
cin>>dd.x>>dd.y;
cout<<by[vis[dd.x][dd.y]]<<endl;
}
return 0;
}