状态压缩+暴搜
trick点:指甲剪可以反着剪
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define LL long long
struct 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;
else
cout<<bfs()<<endl;
}
return 0;
}