題目描述
有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰44格中的某一格0上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。
輸入格式
第1行爲兩個正整數n,m。
下面n行,每行n個字符,字符只可能是0或者1,字符之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的一個格子,詢問從這一格開始能移動到多少格。
輸出格式
mm行,對於每個詢問輸出相應答案。
輸入
2 2
01
10
1 1
2 2
輸出
4
4
剛開始以爲寬搜就可以
就有了以下的代碼
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m,bx,by,step;
struct node{
int x,y;
};
int map[100010][1000010],visit[100010][100010];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int bfs()
{
queue<node>q;
node t={bx,by};
q.push(t);
while(!q.empty()){
node p;
p=q.front();
q.pop();
for(int i=0;i<4;i++)
{
t.x=p.x+dx[i];
t.y=p.y+dy[i];
}
if(t.x>=1&&t.x<=n&&t.y>=1&&t.y<=n&&map[t.x][t.y]==0&&!visit[t.x][t.y])
{
visit[t.x][t.y]=1;
step++;
q.push(t);
}
}
return step;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
while(m--)
{
scanf("%d%d",&bx,&by);
int ans=bfs();
printf("%d",ans);
}
}
後來超時 再一檢查 很明顯,這題數據很大,讀一組查一遍必然爆炸。
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m,bx,by,d,sum;
char ch;
struct node{
int x,y;
};
int map[1010][1010],flag[1010][1010],a[10000010];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void bfs()
{
queue<node>q;
for(int i=1;i<=n;i++)//查一遍所有的點
for(int j=1;j<=n;j++)
{
node t={i,j};
if(flag[t.x][t.y]==0)//如果他還未屬於任何一個連通塊
{
d++;//創建一個編號爲d++的新連通塊
flag[t.x][t.y]=d;//把點放入此連通塊
q.push(t);入隊 向四周搜索
sum=1;//記錄目前新連通塊點的數量
}
while(!q.empty()){//隊列不爲空
node p;
p=q.front();//取出隊頭
q.pop();//刪除隊頭
for(int i=0;i<4;i++)
{
t.x=p.x+dx[i];
t.y=p.y+dy[i];
if(t.x>=1&&t.x<=n&&t.y>=1&&t.y<=n&&(map[t.x][t.y]!=map[p.x][p.y])&&!flag[t.x][t.y])//滿足不超邊界且不屬於任何一連通塊
{
flag[t.x][t.y]=d;
sum++;//計數
q.push(t);
}
}
}
a[d]=sum;
}
}
int main()
{
int ans;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf(" %c",&ch);
if(ch=='1')
map[i][j]=1;
else
map[i][j]=0;
}
bfs();
while(m--)
{
scanf("%d%d",&bx,&by);
ans=a[flag[bx][by]];
printf("%d\n",ans);
}
}