不喜欢模拟,直接BFS+位压缩保存状态~300+ms还是可以接受的
虽然模拟是0ms...囧~
- #include <iostream>
- #include <list>
- #include <map>
- #include <cmath>
- #include <algorithm>
- #include <bitset>
- #include <queue>
- #include <stack>
- #include <vector>
- using namespace std;
- bool hash[1048576];
- int c[21]={0,1};
- struct state
- {
- int water,t;
- }tmp,p;
- queue<state> q;
- int main()
- {
- int i,hash_tmp=0,t,res=0;
- for(i=2;i<=20;i++)c[i]=c[i-1]*2;
- for(i=1;i<=20;i++)scanf("%d",&t),hash_tmp=2*hash_tmp+t;
- memset(hash,false,sizeof(hash));
- hash[hash_tmp]=true;
- tmp.water=hash_tmp;tmp.t=0;
- if(tmp.water==0)cout<<0<<endl;
- else{
- q.push(tmp);
- while(!q.empty())
- {
- tmp=q.front();tmp.t++;
- for(i=1;i<=20;i++)
- {
- p=tmp;
- p.water^=c[i];
- if(i-1>=1)p.water^=c[i-1];
- if(i+1<=20)p.water^=c[i+1];
- if(hash[p.water])continue;
- q.push(p);
- hash[p.water]=true;
- if(p.water==0)break;
- }
- q.pop();
- if(p.water==0)break;
- }
- printf("%d/n",p.t);
- }
- return 0;
- }