社区讨论

疑问+玄关+进食后入(为什么改一下就对了)

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mk9xvici
此快照首次捕获于
2026/01/12 00:19
上个月
此快照最后确认于
2026/01/16 13:50
上个月
查看原帖
我用的BFS来做,一开始的时候能考虑的都考虑了,但是还是 73pts WA#3#7#13#15
CPP
#include <bits/stdc++.h>
using namespace std;

const int N=305;
int n,m,sx,sy,ex,ey,dis[N][N];
char a[N][N];
bool vis[N][N];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

struct node{
	int x,y;
};

struct gate{
	int x,y;
	char k;
};

queue<node> q;
vector<gate> g;

int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]>='A'&&a[i][j]<='Z'){
				g.push_back((gate){i,j,a[i][j]});
			}
			if(a[i][j]=='@'){
				sx=i;
				sy=j;
				a[i][j]='.';
			}
			if(a[i][j]=='='){
				ex=i;
				ey=j;
				a[i][j]='.';
			}
		}
	}
	vis[sx][sy]=1;
	q.push((node){sx,sy});
	while(q.size()){
		node c=q.front();
		q.pop();
		if(c.x==ex&&c.y==ey){
			cout<<dis[ex][ey];
			return 0;
		}
		for(int i=0;i<4;i++){
			int nx=c.x+dx[i],ny=c.y+dy[i];
			if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]=='#'||vis[nx][ny]){
				continue;
			}
			if(a[nx][ny]=='.'){
				vis[nx][ny]=1;
				dis[nx][ny]=dis[c.x][c.y]+1;
				q.push((node){nx,ny});
			}
			else if(a[nx][ny]>='A'&&a[nx][ny]<='Z'){
				dis[nx][ny]=dis[c.x][c.y]+1;
				for(auto j:g){
					if(j.k==a[nx][ny]&&(j.x!=nx||j.y!=ny)){
						dis[j.x][j.y]=dis[nx][ny];
						q.push((node){j.x,j.y});
						break;
					}
				}
			}
		}
	}
	cout<<dis[ex][ey];
	return 0;
}
后面改了一下,把vis数组去掉就对了,但是不知道为什么,有没有大佬帮忙看一下为什么啊 qwq
CPP
#include <bits/stdc++.h>
using namespace std;

const int N=305;
int n,m,sx,sy,ex,ey,dis[N][N];
char a[N][N];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};

struct node{
	int x,y;
};

struct gate{
	int x,y;
	char k;
};

queue<node> q;
vector<gate> g;

int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]>='A'&&a[i][j]<='Z'){
				g.push_back((gate){i,j,a[i][j]});
			}
			if(a[i][j]=='@'){
				sx=i;
				sy=j;
				a[i][j]='.';
			}
			if(a[i][j]=='='){
				ex=i;
				ey=j;
				a[i][j]='.';
			}
		}
	}
	memset(dis,-1,sizeof(dis));
	dis[sx][sy]=0;
	q.push((node){sx,sy});
	while(q.size()){
		node c=q.front();
		q.pop();
		if(c.x==ex&&c.y==ey){
			cout<<dis[ex][ey];
			return 0;
		}
		for(int i=0;i<4;i++){
			int nx=c.x+dx[i],ny=c.y+dy[i];
			if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]=='#'){
				continue;
			}
			if(a[nx][ny]=='.'){
				if(dis[nx][ny]==-1){
					dis[nx][ny]=dis[c.x][c.y]+1;
					q.push((node){nx,ny});
				}
			}
			else if(a[nx][ny]>='A'&&a[nx][ny]<='Z'){
				for(auto j:g){
					if(j.k==a[nx][ny]&&(j.x!=nx||j.y!=ny)){
						if(dis[j.x][j.y]==-1){
							dis[j.x][j.y]=dis[c.x][c.y]+1;
							q.push((node){j.x,j.y});
						}
						break;
					}
				}
			}
		}
	}
	cout<<dis[ex][ey];
	return 0;
}

回复

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

正在加载回复...