CCF 2016-4-4 游戏(bfs标记)

题目

在这里插入图片描述

题解

直接bfs,状态由r,c,time,既然有三维状态,那就需要有三维标记,这样可以防止重复搜索。

代码

#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;
#define x first
#define y second
const int dr[] = {1,-1,0,0};
const int dc[] = {0,0,1,-1};
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
int n,m,t;
pii cor[105][105];
struct Node {
	int r,c;
	int tim;
};
int vis[105][105][300];
void solve() {
	int ans = INF;
	queue<Node> que;
	que.push((Node){1,1,0});
	memset(vis, 0,sizeof vis);
	while(!que.empty()) {
		Node u = que.front();
		que.pop();
		// cout << u.r <<" " << u.c<<" "<<u.tim << endl;
		if(vis[u.r][u.c][u.tim])
			continue;
		// cout << -1 << endl;
		vis[u.r][u.c][u.tim] = 1;
		if(u.r == n && u.c == m) {
			cout << u.tim << endl;
			return;
		}
		for(int i = 0; i < 4; ++i) {
			int nr = u.r+dr[i], nc = u.c+dc[i];
			int ntim = u.tim+1;
			if(nr < 1 || nr > n || nc < 1 || nc > m || ntim >= cor[nr][nc].x && ntim <= cor[nr][nc].y) continue;
			que.push((Node){nr,nc,ntim});
		}
		// que.push((Node){u.r,u.c,u.tim+1});
	}
}
int main() {
	scanf("%d%d%d", &n, &m,&t);
	int u,v,l,r;
	for(int i = 0; i < t; ++i) {
		scanf("%d%d%d%d", &u, &v, &l, &r);
		cor[u][v].x = l; cor[u][v].y = r;
	}
	solve();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值