• UVa 232


    横排纵排找单词

    先标记,再记录答案
    最后排序,排序时一定要对准首末位置

     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]='';
    47             if(flag)
    48             {
    49                 acr[cnt1].ans[tmp++]=s[i][j];
    50                 if(j==c-1) flag=0,acr[cnt1].ans[tmp]='';
    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]='';
    65             if(flag)
    66             {
    67                 down[cnt2].ans[tmp++]=s[i][j];
    68                 if(i==r-1) flag=0,down[cnt2].ans[tmp]='';
    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:
    ",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 } 
    我自倾杯,君且随意
  • 相关阅读:
    java跳过构造方法新建对象
    java实现类似qq的窗口对聊
    NoSql的产生
    C语言跳出循环
    C语言for循环
    C语言while语句
    C语言条件运算符
    C语言switch语句
    C语言逻辑运算符
    C语言关系运算符
  • 原文地址:https://www.cnblogs.com/nicetomeetu/p/5281894.html
Copyright © 2020-2023  润新知