CCF认证201604-4游戏

原文链接

我的个人博客

原题链接

CCF认证201604-4游戏

思路

很像19年蓝桥杯走迷宫的那个题目。给你一个n*m的迷宫,1表示不可访问,0表示可访问,需要你求出,从(1,1)到(n,m)所需要的最短时间。这个题目也是一样的,只是他的1,0状态是动态变化的而已,但是思路是相通的。我们只有记录当前时间点是否可以访问即可,因此就需要三维的数组了。

代码
#include <bits/stdc++.h>
using namespace std;

//当前的位置和时间 
struct node{
	int r,c,t;
	node(int rr,int cc,int tt):r(rr),c(cc),t(tt){}
};

bool visited[105][105][305];//标记一个点(r,c)在t时刻是否可以访问
//false未访问,可以访问。true表示不可以访问 
int n,m,t;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; 
int main(){
	scanf("%d%d%d",&n,&m,&t);
	while(t--){
		int r,c,a,b;
		scanf("%d%d%d%d",&r,&c,&a,&b);
		for(int i=a;i<=b;i++){
			visited[r][c][i] = true;
		}
	}
	queue<node> q;//用BFS
	q.push(node{1,1,0});
	visited[1][1][0] = true;//标
	while(!q.empty()){
		node v = q.front();
		q.pop();
		if(v.r == n && v.c == m){
			//到达终点
			printf("%d",v.t);
			return 0; 
		}
		for(int i=0;i<4;i++){
			int tr = v.r+dir[i][0];
			int tc = v.c+dir[i][1];
			int time = v.t+1;
			//不越界且可访问 
			if(tr>0&&tr<=n&&tc>0&&tc<=m&&!visited[tr][tc][time]){
				q.push(node{tr,tc,time});
				visited[tr][tc][time] = true;
			}
		}
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值