UVa10651 - Pebble Solitaire

5 篇文章 0 订阅

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

 


Swedish National Contest


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
struct node{
    int a,b,c;
    node(int a,int b,int c):a(a),b(b),c(c){}
};
string st;

int dp[1<<13];
int dfs(int mask){
    if(dp[mask] !=-1) return dp[mask];
    vector<int> v;
    vector<node>pos;
    v.clear();
    pos.clear();
    int tmp = mask;
    for(int i = 0; i < 12; i++){
        v.push_back(tmp%2);
        tmp /= 2;
    }
    int i = 1,ret = v[0];
    bool flag = 0;
    while(i < 12){
        if(v[i]==1){
            ret++;
            if((v[i+1]==1&&v[i-1]==0&&i+1<12)||(v[i+1]==0&&v[i-1]==1&&i+1<12)){
                 flag = 1;
                 pos.push_back(node(i-1,i,i+1));
            }
        }
        i++;
    }
    if(!flag)
        return dp[mask] = ret;
    int ans = 1e8;
    for(int i = 0; i < pos.size(); i++){
        int tma = mask;
        if(v[pos[i].a]==0){
            tma ^=  (1<<pos[i].b);
            tma ^=  (1<<pos[i].c);
            tma  |= (1<<pos[i].a);
        }else{
            tma ^=  (1<<pos[i].b);
            tma |=  (1<<pos[i].c);
            tma ^= (1<<pos[i].a);
        }
        ans = min(ans,dfs(tma));
    }
    return dp[mask] = ans;
}
int main(){
    int ncase;
    cin >> ncase;
    memset(dp,-1,sizeof dp);
    while(ncase--){
            cin >> st;
            int ms = 0;
            for(int i = 0; i < st.size(); i++)
                if(st[i]=='o')  ms |= (1<<i);
            cout<<dfs(ms)<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值