Snakes and Ladders

来源:互联网 发布:人工智能领域期刊 编辑:程序博客网 时间:2024/05/29 03:14

描述

蛇和梯子游戏是一个非常流行的游戏。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.1PROG: 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_JUDGEfreopen("0.in", "r", stdin);freopen("0.out", "w", stdout);#endifint 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 0
原创粉丝点击