Snakes and Ladders

描述

蛇和梯子游戏是一个非常流行的游戏。Fadi希望有人编写一个程序帮助他赢得比赛。Fadi是一个职业骗子,他投骰子可以得到任何期望的点数(1至6)。Fadi希望知道他至少需要投多少次骰子才能赢得比赛。

1.第一个和最后一个方格处没有梯子和蛇。

2.并且蛇和梯子不能相邻。

输入

T(测试数据的个数)

N(棋盘大小, 0<N<=20) S(蛇的个数) L(梯子的个数)

Sx1 Sy1 Sx2 Sy2 ... (蛇的头和尾)

Lx1 Ly1 Lx2 Ly2 ... (梯子的底和顶)

输出

至少需要投骰子的次数

样例输入

1
6 1 3
35 25
3 23 5 16 20 33

样例输出

3

————————————————————集训3.1的分割线————————————————————

思路:BFS。用结构体记录每个点及到达这个点至少需要的投骰子次数。

/*
ID: j.sure.1
PROG: 
LANG: C++
*/
/****************************************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
/****************************************/
const int N = 405;
int in[205];
bool vis[N];
int n, m;
struct Node
{
	int id;
	int ans;
};
queue <Node> q;

int bfs(Node cur)
{
	vis[cur.id] = true;
	q.push(cur);
	Node tmp;
	while(!q.empty() && !vis[n]) {
		tmp.id = q.front().id; 
		tmp.ans = q.front().ans;
		q.pop();
		for(int i = 1; i <= 6; i++) {
			Node nxt;
			nxt.id = tmp.id + i;
			if(in[nxt.id]) {
				nxt.id = in[nxt.id];
			}
			if(nxt.id == n) return tmp.ans+1;
			if(nxt.id < n) {
				vis[nxt.id] = true;
				nxt.ans = tmp.ans+1;
				//printf("%d->%d nxt.ans = %d\n", tmp.id, nxt.id, nxt.ans);
				q.push(nxt);
			}
		}
	}
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("0.in", "r", stdin);
	freopen("0.out", "w", stdout);
#endif
	int T;
	scanf("%d", &T);
	while(T--) {
		int sna, lad;
		scanf("%d%d%d", &n, &sna, &lad);
		n *= n;
		m = sna + lad;
		int id;
		memset(in, 0, sizeof(in));
		memset(vis, 0, sizeof(vis));
		for(int i = 1; i <= m; i++) {
			scanf("%d", &id);
			scanf("%d", &in[id]);
		}
		Node a;
		a.id = 1; a.ans = 0;
		printf("%d\n", bfs(a));
	}
	return 0;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值