P1141 01迷宫


为什么复杂度是对的
每个格子都只被搜过一次,复杂度当然是对的,你TLE可能是你的复杂度问题。

为什么不会爆栈
OJ上栈空间和内存相等。本机评测可以在 Windows 上使用 g++ a.cpp -o a -Wl,stack=268435456编译成256256MiB栈空间调试,自行网上搜索“g++ Windows 扩栈”。
#pragma comment(linker, “/STACK:102400000,102400000”)


好了废话不多说,直接上两套代码
第一个是用dfs做的

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int n,m,x,y,cnt,z;
int f[N][N],vis[N][N],ans[100000];
char s[N][N];

void dfs(int x,int y,int z,int cnt){
	if(x<0||x>=n||y<0||y>=n||z!=s[x][y]-'0'||f[x][y]!=-1)return;
	
	f[x][y]=cnt;
	ans[cnt]++;
	
	dfs(x-1,y,1-z,cnt);//!z也可以的 
	dfs(x+1,y,1-z,cnt);
	dfs(x,y+1,1-z,cnt);
	dfs(x,y-1,1-z,cnt);
}

int main(){
	cin>>n>>m;
	memset(f,-1,sizeof f);
	for(int i=0;i<n;i++)cin>>s[i];

	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		a--,b--;
		if(f[a][b]==-1)dfs(a,b,s[a][b]-'0',i);
		else ans[i]=ans[f[a][b]];
	}
	for(int i=0;i<m;i++)printf("%d\n",ans[i]);
}

第二个是用bfs做的

#include<bits/stdc++.h>
using namespace  std;
const int maxn = 1010;
int n,m,color,cnt;
int vis[maxn][maxn];
int mp[maxn][maxn];
int ans[1000001];
int xx[]={0,1,0,-1};
int yy[]={1,0,-1,0};
void bfs(int x,int y){
	queue<int>h;
	queue<int>l;
	h.push(x);
	l.push(y);
	vis[x][y]=color;
	while(!h.empty()){
		for(int i=0;i<4;i++){
			int dx=h.front()+xx[i];
			int dy=l.front()+yy[i];
			if(dx>=1&&dx<=n&&dy>=1&&dy<=n&&vis[dx][dy]==0&&mp[dx][dy]!=mp[h.front()][l.front()]){
				
				h.push(dx);
				l.push(dy);
				vis[dx][dy]=color;
			}
		}
		h.pop();
		l.pop();
		cnt++;
	}
} 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			char x;
			cin>>x;
			if(x=='1')mp[i][j]=1;
			if(x=='0')mp[i][j]=0;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(!vis[i][j]){
			color++;
			bfs(i,j);
			ans[color]=cnt;
			cnt=0;
			}
			
		}
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		cout<<ans[vis[x][y]]<<endl;
	}
}

在这里插入图片描述
一个250毫秒,一个1500毫秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值