Ultraviolet A 10651 Pebble Solitaire (BFS)
Ultraviolet A 10651 Pebble Solitaire
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 your 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 A, B, 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 B from 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 teenth 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-oo --
-O -- ooo-
Oooooooooooooo
Oooooooooo-o
1
2
3
12
1
The following figure shows the arrangement of pawns (in fact, pebbles, as pawns). 'O' indicates that there are pawns at the current position, and '-' indicates that there is null. When "oo-" or "-oo" occurs, the pawn can jump to the other side of the Support Point, the pawns used as the support point will disappear. Q. The minimum number of pieces left after the jump. Solution: Both BFS and DFS can be used.
#include
#include
#include #include
#include
using namespace std;typedef long long ll;char s[13];int first, last, Min, vis[10005];struct queue{ char num[13]; int hash() { int sum = 0; for (int i = 0; i < 12; i++) { if (num[i] == 'o') { sum += 1 << (12 - i); } } return sum; }};queue q[100005];void BFS() { char temp[13]; while (first < last) { int cnt = 0; strcpy(temp, q[first].num); for (int i = 0; i < 12; i++) { if (temp[i] == 'o') { cnt++; if (i >= 2) { if (temp[i - 1] == 'o' && temp[i - 2] == '-') { strcpy(q[last].num, temp); q[last].num[i] = q[last].num[i - 1] = '-'; q[last].num[i - 2] = 'o'; if (!vis[q[last].hash()]) { vis[q[last].hash()] = 1; last++; } } } if (i <= 9) { if (temp[i + 1] == 'o' && temp[i + 2] == '-') { strcpy(q[last].num, temp); q[last].num[i] = q[last].num[i + 1] = '-'; q[last].num[i + 2] = 'o'; if (!vis[q[last].hash()]) { vis[q[last].hash()] = 1; last++; } } } } } if (cnt < Min) Min = cnt; first++; }}int main() { int T; scanf("%d", &T); while (T--) { memset(vis, 0, sizeof(vis)); scanf("%s", s); first = last = 1; strcpy(q[first].num, s); vis[q[first].hash()] = 1; last++; Min = 13; BFS(); printf("%d\n", Min); } return 0;}