`
从此醉
  • 浏览: 1050025 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

snakes and ladders

 
阅读更多

蛇和梯子的游戏。网上还木有这个题。…………


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stdlib.h>
using namespace std;


bool visitFlag[10001]; //该位置是否到达过
int snakeFlag[10001]; //此处是否有蛇头
int ladderFlag[10001]; //此处是否有梯子
int end;


//用滚动数组
int bfs(queue<int> q[2])
{
	int a = 0, b = 1;
	int step = 0;
	while (!q[a].empty())
	{
		swap(a, b);
		step++; //当前步数加1
		while (!q[b].empty())
		{
			int cur = q[b].front();
			q[b].pop();
			if (cur == end)
				return step - 1;


			for (int i = 1; i <= 6; i++)
			{
				if (cur + i == end)
					return step;
				if (cur + i <= end && !visitFlag[cur+i])
				{
					//无论是到蛇头,或是梯子处,都等于同时访问了两处
					int temp = snakeFlag[cur + i];
					if(temp > 0 && !visitFlag[temp]){
						if(temp == end)
							return step;
						visitFlag[temp] = true;
						q[a].push(temp);
					}else{
						temp = ladderFlag[cur + i];
						if(temp > 0 && !visitFlag[temp]){
							if(temp == end)
								return step;
							visitFlag[temp] = true;
							q[a].push(temp);
						}else{
							q[a].push(cur + i);


						}
					}
					visitFlag[cur + i] = true;
				}
			}
		}
	}


	return 0;
}


int main()
{
	int k;
	cin >> k;
	int N, S, L;


	while (k--)
	{
		scanf("%d %d %d", &N, &S, &L);
		int a, b;
		end = N * N;
		memset(visitFlag, 0, sizeof(visitFlag));
		memset(snakeFlag, 0, sizeof(snakeFlag));
		memset(ladderFlag, 0, sizeof(ladderFlag) );


		for (int i = 0; i < S; i++)
		{
			cin >> a >> b;
			snakeFlag[a] = b;
		}


		for (int i = 0; i < L; i++)
		{
			cin >> a >> b;
			ladderFlag[a] = b;
		}


		queue<int> q[2];
		q[0].push(1);
		cout << bfs(q) << endl;
		system("pause");
	}
	return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics