您的位置:首页 > 大数据 > 人工智能

ZOJ Monthly, November 2012 - J - Trim the Nails

2012-11-25 17:40 561 查看

TrimtheNails



TimeLimit:2SecondsMemoryLimit:65536KB



Robertisclippinghisfingernails.Butthenailclipperisoldandtheedgeofthenailclipperispotholed.


Thenailclipper'sedgeisNmillimeterswide.AndweuseNcharacters('.'or'*')torepresentthepotholednailclipper.'.'represents1badmillimeteredge,and'*'represents1goodmillimeteredge.(eg."*****"isa5millimetersnailclipperwiththewholeedgegood."***..."isa6millimetersnailclipperwithhalfofitsedgegoodandhalfofitsedgebad.)


NoticeRobertcanturnovertheclipper.Turningovera"**...*"-nailclipperwillmakea"*...**"-nailclipper.


One-millimetergoodedgewillcutdownRobert'sone-millimeterfingernail.Butbadonewillnot.Itwillkeeptheone-millimeterunclipped.


Robert'sfingernailisMmillimeterswide.HowmanytimesatleastshouldRobertcuthisfingernail?


Input


Therewillbemultipletestcases(about15).Pleaseprocesstotheendofinput.


FirstlinecontainsoneintegerN.(1≤N≤10)


SecondlinecontainsNcharactersonlyconsistsof'.'and'*'.


ThirdlinecontainsoneintegerM.(1≤M≤20)


Output


Onelineforeachcasecontainingonlyoneintegerwhichistheleastnumberofcuts.IfRobertcannotclipperhisfingernailthenoutput-1.


SampleInput


8
****..**
4
6
*..***
7


SampleOutput


1
2


Hint


Weuse'-'topresentthefingernail.
Forsample1:
fingernail:	----
nailclipper:	****..**
Requiresonecut.

Forsample2:
fingernail:			-------
nailclipper:			*..***
nailclipperturnedover:	***..*
Requirestwocuts.

分析:将可以使用的指甲刀状态列出,然后bfs指甲的状态,直到为0


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
usingnamespacestd;
intnail[1<<21];
intcut[70];

typedefstructS{
boolvis[70];
intans;
}NODE;
NODEx,y;
chars[13];
intstr[13];

intmain(){
intn,m,i,j,cnt,temp,init,a,cal;
while(scanf("%d",&n)!=EOF){
scanf("%s",s);
scanf("%d",&m);
init=(1<<m)-1;
for(i=0;i<n;++i){
if(s[i]=='*')
str[i]=1;
else
str[i]=0;
}
temp=0;
for(i=0;i<n;++i){
temp=(temp<<1)+str[i];
}

if(!temp){
printf("-1\n");
continue;
}
cnt=0;
a=temp;
while(temp){
cut[cnt++]=temp;
temp>>=1;
}

while((a<<1)&init){
a<<=1;
cut[cnt++]=a;
}
temp=0;
for(i=n-1;i>=0;--i){
temp=(temp<<1)+str[i];
}
a=temp;
while(temp){
cut[cnt++]=temp;
temp>>=1;
}
while((a<<1)&init){
a<<=1;
cut[cnt++]=a;
}
memset(nail,0,sizeof(nail));
queue<NODE>q;
x.ans=init;
//printf("init=%d\n",init);
nail[init]=1;
memset(x.vis,0,sizeof(x.vis));
q.push(x);
for(i=0;i<cnt;++i){
//printf("%d%d\n",i,cut[i]);
cut[i]=~cut[i];
}
while(!q.empty()){
x=q.front();
//printf("ans=%d\n",x.ans);
q.pop();
for(i=0;i<cnt;++i){
if(x.vis[i])
continue;
cal=x.ans&cut[i];
if(!cal)
gotoL;
if(!nail[cal]){
y.ans=cal;
nail[cal]=1;
memcpy(y.vis,x.vis,sizeof(x.vis));
y.vis[i]=1;
q.push(y);
}
}
}
L:
inttot=1;
for(i=0;i<cnt;++i)
if(x.vis[i])
++tot;
printf("%d\n",tot);
}
return0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: