20分求调,双端队列
查看原帖
20分求调,双端队列
923022
Walledjc楼主2024/8/14 13:04

双端队列代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,d[505][505];
char s[505][505];
struct node{
	int x,y,sum;
};
deque<node>q;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int a1,b1,a2,b2;
int main(){
	ios::sync_with_stdio(false);
	while(1){
		cin>>n>>m;
		if(n==0&&m==0) break;
		for(int i=1;i<=n;i++) cin>>(s[i]+1);
		cin>>a1>>b2>>a2>>b2;
		a1++,b1++,a2++,b2++;
		while(!q.empty()) q.pop_back();
		memset(d,0x3f,sizeof(d));
		q.push_back(node{a1,b1,0});
		d[a1][b1]=0;
		while(!q.empty()){
			node x=q.front();
			q.pop_front();
			if(x.x==a2&&x.y==b2){
				cout<<x.sum<<endl;
				break;
			}
			for(int i=0;i<4;i++){
				int tx=x.x+dx[i];
				int ty=x.y+dy[i];
				if(tx<1||ty<1||tx>n||ty>m) continue;
				if(s[x.x][x.y]==s[tx][ty]){
					if(x.sum>=d[tx][ty]) continue;
					else{
						d[tx][ty]=x.sum;
						q.push_front(node{tx,ty,x.sum});
					}
				}
				else{
					if(x.sum+1>=d[tx][ty]) continue;
					else{
						d[tx][ty]=x.sum+1;
						q.push_back(node{tx,ty,x.sum+1});
					}
				}
			}
		}
	}
	return 0;
}
2024/8/14 13:04
加载中...