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)