描述
蛇和梯子游戏是一个非常流行的游戏。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;
}