題意:12個位置,有些有鵝卵石,有些是空的,2個連續的鵝卵石,
如果其左邊連著的那個是空的,那麼第二個鵝卵石可移動到那個空的位置上,並移除第1個鵝卵石;
如果其右邊連著的那個是空的,那麼第一個鵝卵石可移動到那個空的位置上,並移除第2個鵝卵石。
問最後最少可以剩下多少個鵝卵石。
option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=1592
——>>
狀態壓縮
判斷其若未是不可移動的最終態,則繼續進行dp,怎麼判?12個位置3個3個掃一次即可。
[cpp] v
#include
using namespace std;
int minn;
int dp(int x)
{
int i, cnt = 0;
for(i = 1; i <= 10; i++)
if(((x&(1<<(i-1))) && (x&(1<
{
x ^= (1<<(i-1));
x ^= (1<
x ^= (1<<(i+1));
int temp = dp(x);
if(temp < minn) minn = temp; //更新最小值
x ^= (1<<(i-1)); //回溯
x ^= (1<
x ^= (1<<(i+1)); //回溯
cnt++;
}
if(cnt == 0) //判斷是否為最終態
{
int ans = 0;
for(i = 0; i < 12; i++)
if(x&(1<
if(ans < minn) minn = ans;
}
return minn;
}
int main()
{
char s[15];
int T, i;
cin>>T;
while(T--)
{
cin>>s;
int a = 0;
for(i = 0; i < 12; i++)
if(s[i] == 'o') a = a^(1<
minn = (1<<30);
cout<
}
return 0;
}