洛谷 p1141 寬度優先搜索 bfs

題目描述
有一個僅由數字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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章