UVA - 232.Crossword Answers 题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/82181671

UVA - 232.Crossword Answers 题解

欢迎访问我的Uva题解目录https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

UVA - 232.Crossword Answers题目描述

题意解析

输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。

算法设计

利用二维char数组存储整个puzzle,在读取字符的过程中将起始格的横纵坐标按顺序存储到一个vector<pair<int,int>>的变量num中,定义一个bool数组visit来表示相应起始格是否被访问过。输出时遍历num按要求输出单词,如果输出的单词中包含起始格,则将相应起始格对应的visit中元素置true,表示该起始格已被访问过,以后不再输出。

C++代码

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=(a);i<(b);++i)//for循环的一种简单写法的宏定义
using namespace std;
int main(){
    int r,c;
    char puzzle[10][10];//存储网格
    scanf("%d",&r);
    for(int n=1;r>0;++n){
        scanf("%d",&c);
        vector<pair<int,int>>num;//存储起始格的位置,数组下标+1代表起始格序号
        if(n>1)
            puts("");//输出两个Puzzle之间的空行
        _for(i,0,r){
            getchar();//吸收换行符
            _for(j,0,c){
                puzzle[i][j]=getchar();//获取字符
                //判断是否是起始格
                if(puzzle[i][j]!='*'&&(i==0||j==0||puzzle[i-1][j]=='*'||puzzle[i][j-1]=='*'))
                    num.push_back({i,j});
            }
        }
        vector<bool>visit(num.size(),false);//标记一个起始格是否已被访问过
        printf("puzzle #%d:\nAcross\n",n);
        _for(i,0,num.size()){//横向输出单词
            if(!visit[i]){
                printf(" %s%d.",i<9?" ":"",i+1);
                for(int j=num[i].second;j<c&&puzzle[num[i].first][j]!='*';++j){
                    putchar(puzzle[num[i].first][j]);
                    //如果当前处理的格子是起始格,在num中找到该起始格的下标并置对应的visit元素为true
                    auto t=find(num.begin(),num.end(),make_pair(num[i].first,j))-num.begin();
                    if(t<num.size())
                        visit[t]=true;
                }
                puts("");
            }
        }
        puts("Down");//纵向输出单词
        fill(visit.begin(),visit.end(),false);
        _for(i,0,num.size()){
            if(!visit[i]){
                printf(" %s%d.",i<9?" ":"",i+1);
                for(int j=num[i].first;j<r&&puzzle[j][num[i].second]!='*';++j){
                    putchar(puzzle[j][num[i].second]);
                    auto t=find(num.begin(),num.end(),make_pair(j,num[i].second))-num.begin();
                    if(t<num.size())
                        visit[t]=true;
                }
                puts("");
            }
        }
        scanf("%d",&r);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/richenyunqi/article/details/82181671