HDU 4119Isabella's Message2011成都现场赛I题(字符串模拟)


34o.do.ng.grmno.i..*..*.*.....*...2goodmorning4..lfeoyvoeouvrer..*..*......*.*.5iyoutheloveforever4.sles.c.e.fs..uu*....*.....*..*.1successful
Case #1: good morningCase #2: love you foreverCase #3: FAIL TO DECRYPT
题目大意:给一个n*n的矩阵,n为偶数,矩阵由小写字母和'.'组成,'.'表示空格,再给一个n*n矩阵,由'.'和'*'组成,'*'表示洞,'.'表示障碍。
现在将2张卡片重合,将能看到的字符从上往下从左往右依次取出组成一个新单词。卡片可以顺时针旋转90度,再取出能看到的
单词,一共有4个单词,4个单词再依次组成一个句子,因为卡片是连续转动的,所以4个单词首尾相连,任取一个做句子头,所
以句子一共也是4个。再给m个单词,求出字典序最小的句子并要求句子中每个单词都在给定的m个单词中。
坐标转换公式(i,j)——> (j,n-i+1) 坐标变换公式,从1,1开始。
先求出4个字符串连接好形成的字符串,然后改变连接顺序,组成新的4个字符串连接好形成的字符串。然后查找是否全部由单词本中的单词组成。(这段话来自于Hadis_yuki)
解题思路:开始是中间的连续的空格没有处理好,然后还有map没有初始化,结果WA出翔了。终于A了,当时比赛如果我做的话,可能会一WA到底。。需要修炼啊!
题目地址:Isabella's Message
AC代码:
#include<iostream>#include<cstring>#include<string>#include<cmath>#include<map>#include<cstdio>#include<algorithm>using namespace std;char a[55][55]; //开始的地图char tmp[55][55];char mes[10005]; //存放连接好以后的字符串,还没有去空格string res[5];int visi[55][55]; //表示洞int vis[55][55]; //visi的tempint n,w;map <string,int> word; //认识的单词int cmp(string a,string b){ if(a<b) return 1; return 0;}void rotat() //顺时针旋转90度{ int i,j; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(visi[i][j]==1) vis[j][n+1-i]=1; memset(visi,0,sizeof(visi)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) visi[i][j]=vis[i][j];}void solve(){ int t=0; //如果存在一个满足条件则变为1 int i,j,k,l; for(i=0;i<=3;i++) res[i]=""; //每次都要清空 for(l=0;l<4;l++) { int flag=0; k=4; int p=0; while(k--) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(visi[i][j]==1) mes[p++]=a[i][j]; rotat(); } mes[p]='\0'; //mes是存放连接好以后的字符串,还没有去空格 //cout<<mes<<endl; i=0; while(i<p) //去前面的空格 { if(mes[i]==' ') i++; else break; } j=p-1; //去后面的空格 while(j>=0) { if(mes[j]==' ') j--; else break; } p=j; //cout<<i<<" "<<p<<endl; //cout<<mes<<endl; char tmp1[55]; int tt=0; for(j=i;j<=p;j++) { if(mes[j]==' '&&mes[j+1]==' ') //处理中间的空格 continue; else if(mes[j]==' '||j==p) { if(j==p) tmp1[tt++]=mes[j]; tmp1[tt]='\0'; //cout<<tt<<endl; tt=0; //cout<<tmp1<<endl; if(word[tmp1]) { if(res[t]=="") res[t]=res[t]+tmp1; else res[t]=res[t]+" "+tmp1; } else { res[t]=""; flag=1; break; } } else { tmp1[tt++]=mes[j]; } } if(!flag) t++; rotat(); } if(t==0) puts("FAIL TO DECRYPT"); else { sort(res,res+t,cmp); cout<<res[0]<<endl; }}int main(){ int tes,i,j; scanf("%d",&tes); for(int te=1;te<=tes;te++) { memset(visi,0,sizeof(visi)); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%s",a[i]+1); //a代表地图 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(a[i][j]=='.') a[i][j]=' '; for(i=1;i<=n;i++) { scanf("%s",tmp[i]+1); for(j=1;j<=n;j++) if(tmp[i][j]=='*') visi[i][j]=1; //visi代表* } scanf("%d",&w); //认识的单词数 string temp; word.clear(); for(i=0;i<w;i++) { cin>>temp; word[temp]=2; } //temp="}"; //word[temp]=2; printf("Case #%d: ",te); solve(); } /*int i,w; scanf("%d",&w); //认识的单词数 string temp; for(i=0;i<w;i++) { cin>>temp; word[temp]=2; } temp="}"; word[temp]=2; char tm[20]; while(cin>>tm) { if(word[tm]) cout<<"yes"<<endl; else cout<<"no"<<endl; }*/ return 0;}/*34o.do.ng.grmno.i..*..*.*.....*...4goomorningodgo4..lfeoyvoeouvrer..*..*......*.*.5iyoutheloveforever4.sles.c.e.fs..uu*....*.....*..*.1successful*/