UVa 232 - Crossword Answers
Posted nicetomeetu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 232 - Crossword Answers相关的知识,希望对你有一定的参考价值。
横排纵排找单词
先标记,再记录答案
最后排序,排序时一定要对准首末位置
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <iomanip> 5 using namespace std; 6 struct T{ 7 int num; 8 char ans[15]; 9 }down[300],acr[300]; 10 int r,c,cnt1,cnt2,cnt,tmp,k; 11 char s[15][15]; 12 int fl[15][15]; 13 bool flag; 14 bool cmp(T a,T b) 15 { 16 return a.num<b.num; 17 } 18 void mark() 19 { 20 memset(fl,0,sizeof(fl)); 21 for(int i=0;i<r;i++) if(s[i][0]!=‘*‘) fl[i][0]=1; 22 for(int i=0;i<r;i++) 23 for(int j=1;j<c;j++) 24 if(s[i][j-1]==‘*‘&&s[i][j]!=‘*‘) fl[i][j]=1; 25 for(int i=0;i<c;i++) if(s[0][i]!=‘*‘) fl[0][i]=1; 26 for(int i=1;i<r;i++) 27 for(int j=0;j<c;j++) 28 if(s[i-1][j]==‘*‘&&s[i][j]!=‘*‘) fl[i][j]=1; 29 cnt=1; 30 for(int i=0;i<r;i++) 31 for(int j=0;j<c;j++) 32 if(fl[i][j]) fl[i][j]=cnt++; 33 } 34 void fuc() 35 { 36 cnt1=cnt2=0; flag=0; 37 for(int i=0;i<r;i++) 38 { 39 for(int j=0;j<c;j++) 40 { 41 if(( j==0 || s[i][j-1]==‘*‘)&&s[i][j]!=‘*‘) 42 { 43 acr[++cnt1].num=fl[i][j]; 44 tmp=0,flag=1; 45 } 46 if(s[i][j]==‘*‘) flag=0,acr[cnt1].ans[tmp]=‘\0‘; 47 if(flag) 48 { 49 acr[cnt1].ans[tmp++]=s[i][j]; 50 if(j==c-1) flag=0,acr[cnt1].ans[tmp]=‘\0‘; 51 } 52 } 53 } 54 flag=0; 55 for(int j=0;j<c;j++) 56 { 57 for(int i=0;i<r;i++) 58 { 59 if((i==0 || s[i-1][j]==‘*‘) && s[i][j]!=‘*‘) 60 { 61 down[++cnt2].num=fl[i][j]; 62 tmp=0,flag=1; 63 } 64 if(s[i][j]==‘*‘&&flag) flag=0,down[cnt2].ans[tmp]=‘\0‘; 65 if(flag) 66 { 67 down[cnt2].ans[tmp++]=s[i][j]; 68 if(i==r-1) flag=0,down[cnt2].ans[tmp]=‘\0‘; 69 } 70 } 71 } 72 } 73 int main() 74 { 75 k=1; 76 while(cin>>r&&r) 77 { 78 cin>>c; 79 for(int i=0;i<r;i++) cin>>s[i]; 80 mark(); 81 fuc(); 82 sort(acr+1,acr+cnt1+1,cmp); 83 sort(down+1,down+cnt2+1,cmp); 84 if(k>1) puts(""); 85 printf("puzzle #%d:\n",k++); 86 puts("Across"); 87 if(cnt1) 88 for(int i=1;i<=cnt1;i++) 89 cout<<setw(3)<<acr[i].num<<‘.‘<<acr[i].ans<<endl; 90 puts("Down"); 91 if(cnt2) 92 for(int i=1;i<=cnt2;i++) 93 cout<<setw(3)<<down[i].num<<‘.‘<<down[i].ans<<endl; 94 } 95 }
以上是关于UVa 232 - Crossword Answers的主要内容,如果未能解决你的问题,请参考以下文章
[算法竞赛入门经典] Crossword Answers ACM/ICPC World Finals 1994,UVa232