ZOJ 3675 Trim the Nails

来源:互联网 发布:会声会影x9激活软件 编辑:程序博客网 时间:2024/06/05 19:27

状态压缩+暴搜

trick点:指甲剪可以反着剪

#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;#define LL long longstruct State{int state,step;State(int sta=0,int ste=0){state=sta;step=ste;}};LL cli1;LL cli2;int n,m;int vis[1<<21];int bfs(){State tmp;memset(vis,0,sizeof(vis));queue<State> q;q.push(State(0,0));vis[0]=1;while(!q.empty()){State u=q.front();q.pop();if(u.state==((1<<m)-1))return u.step;for(int i=0;i<m;i++){tmp=u;tmp.state|=((cli1<<i)&((1<<m)-1));if(vis[tmp.state]==0){tmp.step++;vis[tmp.state]=1;q.push(tmp);}tmp=u;tmp.state|=((cli2<<i)&((1<<m)-1));if(vis[tmp.state]==0){tmp.step++;vis[tmp.state]=1;q.push(tmp);}}for(int i=0;i<n;i++){tmp=u;tmp.state|=((cli1>>i)&((1<<m)-1));if(vis[tmp.state]==0){tmp.step++;vis[tmp.state]=1;q.push(tmp);}tmp=u;tmp.state|=((cli2>>i)&((1<<m)-1));if(vis[tmp.state]==0){tmp.step++;vis[tmp.state]=1;q.push(tmp);}}}}int main(){char str[100];while(cin>>n){cin>>str;cli1=cli2=0;for(int i=0;i<n;i++){if(str[i]=='*'){cli1|=1<<i;cli2|=1<<(n-i-1);}}cin>>m;if(cli1==0)cout<<-1<<endl;elsecout<<bfs()<<endl;}return 0;}