社区讨论

79分 急救 有大佬帮我改吗bfs

P1825[USACO11OPEN] Corn Maze S参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m0522t62
此快照首次捕获于
2024/08/22 17:03
2 年前
此快照最后确认于
2025/11/04 22:44
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
char e;
int mg[400][400],f[400][400];
struct dl{
	int x,y;
}nw,nxt;
queue<dl> q;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int main(){
	scanf("%d%d",&n,&m);
	memset(f,-1,sizeof(f));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf(" %c",&e);
			if(e=='#') mg[i][j]=1;
			else if(e=='=') mg[i][j]=-1;
			else if(e=='.') mg[i][j]=0;
			else if(e=='@'){
				f[i][j]=0;
				nw.x=i;
				nw.y=j;
				q.push(nw);
			} 
			else{
				mg[i][j]=e-'A'+10;
			} 
		}
	}
	while(!q.empty()){
		nw=q.front();
		q.pop();
		for(int i=1;i<=4;i++){
			int xx=nw.x+dx[i],yy=nw.y+dy[i];
			if(mg[xx][yy]>=10&&mg[nw.x][nw.y]<10){
				//printf("##\n");
				f[xx][yy]=-1;
			}
			if(xx>0&&yy>0&&xx<=n&&yy<=m&&mg[xx][yy]!=1&&f[xx][yy]==-1){
			if(mg[xx][yy]<10) f[xx][yy]=f[nw.x][nw.y]+1;
				if(mg[xx][yy]==0){
					nxt.x=xx;
					nxt.y=yy;
				}
				else if(mg[xx][yy]==-1){
					printf("%d",f[xx][yy]);
					return 0;
				}
				else if(mg[xx][yy]>=10){
					int ff=0;
					for(int l=1;l<=n;l++){
						for(int ll=1;ll<=m;ll++){
							if(mg[l][ll]==mg[xx][yy]&&(yy!=ll||xx!=l)){
								ff=1;
								nxt.x=l;
								nxt.y=ll;
								f[l][ll]=f[xx][yy]=f[nw.x][nw.y]+1;
							}
						}
					}
					if(ff==0){
						nxt.x=xx;
						nxt.y=yy;
					}
				}
				q.push(nxt);
			}
		}
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...