Uva 10651 Pebble Solitaire
解法:状态压缩。只有12个洞,所以状态最多只有2^12种。。。然后dfs一下找出来所有合法状态即可。
对于位运算的操作:
x&(1<<i)表示取出第i位;
x&(~(1<<i))表示把第i位变成0;
x|(1<<i)表示把第i位变成1;
1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #define N 5000 8 using namespace std; 9 bool flag[N]; 10 string s; 11 int ans; 12 void checkmin(int &a,int b){ 13 a=a<b?a:b; 14 } 15 void dfs(int n){ 16 if(flag[n]) return; 17 flag[n]=1; 18 int cnt=0; 19 for(int i=0;i<12;i++) 20 if(n&(1<<i))++cnt; 21 checkmin(ans,cnt); 22 for(int i=0;i<10;i++){ 23 if((n&(1<<i))&&(n&(1<<(i+1)))&&!(n&(1<<(i+2)))){ 24 int t=n; 25 t&=~(1<<i); 26 t&=~(1<<(i+1)); 27 t|=(1<<(i+2)); 28 dfs(t); 29 } 30 if(!(n&(1<<i))&&(n&(1<<(i+1)))&&(n&(1<<(i+2)))){ 31 int t=n; 32 t|=(1<<i); 33 t&=~(1<<(i+1)); 34 t&=~(1<<(i+2)); 35 dfs(t); 36 } 37 } 38 return ; 39 } 40 int main(){ 41 int t; 42 cin>>t; 43 while(t--){ 44 cin>>s; 45 int x=0; 46 for(int i=0;i<s.size();i++) 47 if(s[i]=='o')x^=(1<<i); 48 memset(flag,0,sizeof(flag)); 49 ans=1<<30; 50 dfs(x); 51 cout<<ans<<endl; 52 } 53 return 0; 54 }