01bfs 求调
查看原帖
01bfs 求调
526895
WYZ20030051楼主2023/11/5 11:49

rt,过不了样例中的第四组数据

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstdlib>
#include<set>
using namespace std;
#define ll long long
#define ull unsigned long long
int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*f;
}
const int MAXN=5010;
int n,m;
char g[MAXN][MAXN];
struct node
{
	int x,y,z;
	char c;//记录当前位置的字符 
};
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
deque<node>q;//用deque进行01bfs 
bool vis[MAXN][MAXN];
void bfs()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			vis[i][j]=0;
	}
	q.clear();
	q.push_front((node){1,1,0,g[1][1]});
	vis[1][1]=1;
	while(!q.empty())
	{
		node fir=q.front();
		q.pop_front();
		int x=fir.x,y=fir.y,z=fir.z;
		char c=fir.c;
		if(x==n && y==m)//若遍历到了终点 
		{
			printf("%d\n",z);
			break;
		}
		for(int i=0;i<4;i++)//遍历相邻位置的四个节点 
		{
			int fx=x+dx[i],fy=y+dy[i];
			if(fx<1 || fy<1 || fx>n || fy>m || vis[fx][fy])
				continue;
			vis[fx][fy]=1;
			if(g[fx][fy]==c)
				q.push_front((node){fx,fy,z,c});//该点对答案的贡献为0 
			else
				q.push_back((node){fx,fy,z+1,g[fx][fy]}); 
		}
	}
}
int main()
{
	int t=read();
	while(t--)
	{
		n=read(),m=read();
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
				cin>>g[i][j];
		}
		bfs();
	}
	return 0;
}
2023/11/5 11:49
加载中...