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; }
相关文章推荐
- ZOJ Monthly, November 2012 - I - Search in the Wiki
- ZOJ Monthly, November 2012 - G - Gao The Sequence
- ZOJ Monthly, November 2012总结
- Trim the Nails (DFS+状态压缩) #by Plato
- ZOJ 3675 Trim the Nails(bfs+状态压缩搜索)
- ZOJ 3675 Trim the Nails (状态压缩+BFS)
- ZOJ 3675 Trim the Nails
- BNU Summer Training 2014.08.26 JZOJ Problem Set - 3675 Trim the Nails
- ZOJ Monthly, November 2012
- zoj 3675 Trim the Nails (BFS+状态压缩)
- ZOJ Monthly, November 2012
- ZOJ 3675 Trim the Nails(状态压缩 + BFS)
- ZOJ 3675 Trim the Nails(bfs+位运算处理)
- ZOJ 3675 Trim the Nails 小水题
- ZOJ Monthly, November 2012
- 2014 Super Training #6 G Trim the Nails --状态压缩+BFS
- ZOJ Monthly, November 2012 慎入
- 122 - ZOJ Monthly, November 2012-I Search in the Wiki map+set 一对多
- ZOJ 3675 Trim the Nails(bfs)
- ZOJ 3675 Trim the Nails(bfs)