P1141 01迷宫:超时,求剪枝
  • 板块题目总版
  • 楼主bailiOxy_gen
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/12 10:23
  • 上次更新2024/7/12 11:28:42
查看原帖
P1141 01迷宫:超时,求剪枝
1127392
bailiOxy_gen楼主2024/7/12 10:23
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};
char a[1005][1005];
struct stu{
	int x,y,num;
	char c;
};
bool vis[1005][1005];
bool check(int x,int y,char c,char c1){
	if(x<1||x>n||y<1||y>n) return false;
	if(vis[x][y]==1) return false;
	if(c1==c) return false;
	return true;
}
queue<stu> q,p;
void bfs(int x,int y,char c){
	q=p;
	memset(vis,0,sizeof(vis));
	int k=0;
	q.push((stu){x,y,1,c});
	vis[x][y]=1;
	while(!q.empty()){
		stu f=q.front();
		q.pop();
		for(int i=1;i<=4;i++){
			int sx=f.x+dx[i];
			int sy=f.y+dy[i];
			if(check(sx,sy,f.c,a[sx][sy])){
				q.push((stu){sx,sy,f.num+1,a[sx][sy]});
				vis[sx][sy]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(vis[i][j]){
				k++;
			}
		}
	}
	cout<<k<<endl;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		bfs(x,y,a[x][y]);
	}
	return 0;
} 
2024/7/12 10:23
加载中...