Crossword Answers UVA

题目大意

感觉挺水的一道题。找出左面右面不存在或者是黑色的格子的白各,然后编号输出一横向单词和竖向单词(具体看原题)

解析

①找出各个格子的编号

②对每个节点搜索一下

③输出的时候注意最后一个数据后面没有空行,也就是空行得在上面出

代码

#include <bits/stdc++.h>
using namespace std;
char mp[100][100];
int bk[100][100],bk1[100][100],bk2[100][100];
int n,m;
void dfs(int x,int y)
{
  printf("%3d.",bk[x][y]);
  while(1)
  {
    if(mp[x][y]!='*'&&y<m)
    {
      cout<<mp[x][y];
      y++;
      bk1[x][y]=1;
    }
    else
    {
      cout<<endl;
      break;
    }
  }
}
void dfs1(int x,int y)
{
  printf("%3d.",bk[x][y]);
  while(1)
  {
    if(mp[x][y]!='*'&&x<n)
    {
      cout<<mp[x][y];
      x++;
      bk2[x][y]=1;
    }
    else
    {
      cout<<endl;
      break;
    }
  }
}
int main()
{
  /*ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);*/
  int t=1;
  while(cin>>n>>m)
  {
    if(n==0)
    break;
    int p=0;
    memset(bk,0,sizeof(bk));
    memset(bk1,0,sizeof(bk1));
    memset(bk2,0,sizeof(bk2));
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    cin>>mp[i][j];
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    if(i-1<0||j-1<0||mp[i-1][j]=='*'||mp[i][j-1]=='*')
    if(mp[i][j]!='*')
    bk[i][j]=++p;
    if(t>1)
    cout<<"
";
    printf("puzzle #%d:
",t++);
    printf("Across
");
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    if(!bk1[i][j]&&mp[i][j]!='*')
    dfs(i,j);
    printf("Down
");
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    if(!bk2[i][j]&&mp[i][j]!='*')
    dfs1(i,j);
    //cout<<"
";
  }
}
原文地址:https://www.cnblogs.com/baccano-acmer/p/10028216.html