社区讨论

求助,悬赏关注

P9065 [yLOI2023] 云梦谣参与者 5已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@lo35g5xy
此快照首次捕获于
2023/10/24 01:06
2 年前
此快照最后确认于
2023/10/24 01:06
2 年前
查看原帖
CPP
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int n,m,k,h[3005][3005],dx[4] = {1,-1,0,0},dy[4] = {0,0,1,-1};
bool vis[3005][3005],fly[3005][3005],isnot = false;

struct node
{
	int x,y,step;
};

queue<node> q;

int bfs()
{
	q.push({1,1,0});
	vis[1][1] = true;
	while(!q.empty())
	{
		int x = q.front().x,y = q.front().y,step = q.front().step;
		q.pop();
		
		if(x == n && y == m) return step;
		
		for(int i=0;i<4;i++)
		{
			int xnew = x + dx[i],ynew = y + dy[i];
			if(xnew < 1 || xnew > n || ynew < 1 || ynew > m || h[xnew][ynew] == 0 || vis[xnew][ynew] == true) continue;
			q.push({xnew,ynew,step+1});
			vis[xnew][ynew] = true;
		}
		
		if(isnot == false && fly[x][y] == true)
		{
			for(int i=1;i<=n;i++)
				for(int j=1;j<=m;j++)
					if(fly[i][j] == true && vis[i][j] == false)
					{
						if(h[x][y] == h[i][j]) q.push({i,j,step+1});
						else q.push({i,j,step+2});
						vis[i][j] = true; 
					}
			isnot = true;
		}
	}
	return -1;
}

int main()
{
	memset(vis,false,sizeof(vis));
	memset(fly,false,sizeof(fly));
	scanf("%d %d %d",&n,&m,&k);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&h[i][j]);
	
	for(int i=1;i<=k;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		fly[x][y] = true;
	}
	
	int ans = bfs();
	printf("%d\n",ans);
	return 0;
}
为什么错了。

回复

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

正在加载回复...