UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))

Problem A
Pebble Solitaire
Input:
 standard input
Output: standard output
Time Limit: 1 second
 

Pebble solitaire is an interesting game. This is a game where you are given a board with an arrangement of small cavities, initially all but one occupied by a pebble each. The aim of the game is to remove as many pebbles as possible from the board. Pebbles disappear from the board as a result of a move. A move is possible if there is a straight line of three adjacent cavities, let us call them AB, and C, with B in the middle, where A is vacant, but B and C each contain a pebble. The move constitutes of moving the pebble from C to A, and removing the pebble in Bfrom the board. You may continue to make moves until no more moves are possible.

 

In this problem, we look at a simple variant of this game, namely a board with twelve cavities located along a line. In the beginning of each game, some of the cavities are occupied by pebbles. Your mission is to find a sequence of moves such that as few pebbles as possible are left on the board.

 

Input

The input begins with a positive integer n on a line of its own. Thereafter n different games follow. Each game consists of one line of input with exactly twelve characters, describing the twelve cavities of the board in order. Each character is either '-' or 'o' (The fifteenth character of English alphabet in lowercase). A '-' (minus) character denotes an empty cavity, whereas a 'o' character denotes a cavity with a pebble in it. As you will find in the sample that there may be inputs where no moves is possible.

 

Output

For each of the n games in the input, output the minimum number of pebbles left on the board possible to obtain as a result of moves, on a row of its own.

 

Sample Input                              Output for Sample Input

5

---oo-------

-o--o-oo----

-o----ooo---

oooooooooooo

oooooooooo-o

1

2

3

12

1

 


题意:就是跳棋。比如-oo 可以第三个棋子跳到-上 消除掉中间那个o。

思路:bfs + 哈希判重。记录下每次状态。之后不考虑重复状态。

代码:

#include <stdio.h>
#include <string.h>
#include <limits.h>

int t, vis[5555], ans;
char str[15];
struct Q {
	char str[15];
	int num;
} q[5555];
int hash(char *str) {
	int num = 0, i;
	for (i = 0; i < 12; i ++) {
		if (str[i] == 'o') {
			num += 1 << i;
		}
	}
	return num;
}

void bfs() {
	int i, head = 0, rear = 1;
	ans = INT_MAX;
	memset(q, 0, sizeof(q));
	memset(vis, 0, sizeof(vis));
	strcpy(q[0].str, str);
	vis[hash(q[0].str)] = 1;
	for (i = 0; i < 12; i ++)
		if (q[0].str[i] == 'o')
			q[0].num ++;
	while (head < rear) {
		if (q[head].num < ans)
			ans = q[head].num;
		for (i = 0; i < 10; i ++) {
			if (q[head].str[i] == '-' && q[head].str[i + 1] == 'o' && q[head].str[i + 2] == 'o') {
				char sb[15];
				strcpy(sb, q[head].str);
				sb[i] = 'o';
				sb[i + 1] = '-';
				sb[i + 2] = '-';
				if (!vis[hash(sb)]) {
					vis[hash(sb)] = 1;
					strcpy(q[rear].str, sb);
					q[rear].num = q[head].num - 1;
					rear ++;
				}
			}
		}
		for (i = 0; i < 10; i ++) {
			if (q[head].str[i] == 'o' && q[head].str[i + 1] == 'o' && q[head].str[i + 2] == '-') {
				char sb[15];
				strcpy(sb, q[head].str);
				sb[i] = '-';
				sb[i + 1] = '-';
				sb[i + 2] = 'o';
				if (!vis[hash(sb)]) {
					vis[hash(sb)] = 1;
					strcpy(q[rear].str, sb);
					q[rear].num = q[head].num - 1;
					rear ++;
				}
			}
		}
		head ++;
	}
}
int main () {
	scanf("%d%*c", &t);
	while (t --) {
		gets(str);
		bfs();
		printf("%d\n", ans);
	}
	return 0;
}



你可能感兴趣的:(UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?)))