Crossword Answers UVA - 232

本文介绍了一种解决填字游戏的算法,通过查找空白格子并进行编号,然后使用深度优先搜索遍历横向和纵向的单词,最后输出这些单词。代码使用C++实现,包括了对每个节点的搜索和输出的细节。

题目大意

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

解析

①找出各个格子的编号

②对每个节点搜索一下

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

代码

#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<<"\n";
    printf("puzzle #%d:\n",t++);
    printf("Across\n");
    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\n");
    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<<"\n";
  }
}

转载于:https://www.cnblogs.com/baccano-acmer/p/10028216.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值