uva--232(字符串模拟)

3 篇文章 0 订阅
3 篇文章 0 订阅

点击打开链接


这是一道字符串模拟题,题意大概是给定一个m*n的网格,黑格用‘*’表示,白格有一个字母,如果一个白格左边或者上面没有黑格子,则称为一个起始格。

然后找出所有横向单词和竖向单词,注意这个地方的横向单词指从一个起始格开始一直往右或者往下,直到遇见黑格子或者出界,并且每个字母在找横向或者竖向单词时只能用一

次 ,所以分为两个步骤,横向找和竖向找,每次判断该格子是不是起始格,并且是否在前面的单词中用过,若没用过就找下去,用过了则继续往下找起始格。

具体代码如下:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#define from(i,a,n)   for(int i=a;i<n;i++)
#define refrom(i,n,a) for(int i=n;i>=a;i--)
#define EPS 1e-10
#define mod 1000000007
using namespace std;

const double INF=0x3f3f3f3f;
const int MAX =11;
char puzzle[MAX][MAX],record[MAX][MAX];//这里的record数组用来记录起始格是否已经用于构成单词
int r,c,pos;

void across()
{
    int cnt=0;
    memset(record,0,sizeof(record));
    printf("Across\n");
    from(i,0,r)
    {
        from(j,0,c)//从左往右,从上往下扫描
        {
            int y=j;
            if(i==0&&puzzle[i][j]!='*')//第一行所有不是黑格子的都是起始格
            {
                cnt++;
                if(!record[i][j]) printf("%3d.",cnt);//如果该起始格没有用过,则一定可以找到一个单词
                else continue;
                while(puzzle[i][y]!='*'&&y<c)//往右输出,一直到遇见黑格子或者越界
                {
                    if(!record[i][y])
                    {
                        printf("%c",puzzle[i][y]);
                        record[i][y++]=1;
                    }
                    else break;
                }
                printf("\n");
                continue;
            }
            if(j==0&&puzzle[i][j]!='*')//第一列所有不是黑格子的但是起始格
            {
                cnt++;
                if(!record[i][j]) printf("%3d.",cnt);
                else continue;
                while(puzzle[i][y]!='*'&&y<c)
                {
                    if(!record[i][y])
                    {
                        printf("%c",puzzle[i][y]);
                        record[i][y++]=1;
                    }
                    else break;
                }
                printf("\n");
                continue;
            }
            if(puzzle[i][j]!='*'&&(puzzle[i][j-1]=='*'||puzzle[i-1][j]=='*'))//不是黑格子并且左边或者上面是黑格子的
            {
                cnt++;
                if(!record[i][j]) printf("%3d.",cnt);
                else continue;
                while(puzzle[i][y]!='*'&&y<c)
                {
                    if(!record[i][y])
                    {
                        printf("%c",puzzle[i][y]);
                        record[i][y++]=1;
                    }
                    else break;
                }
                printf("\n");
                continue;
            }
        }
    }
    return ;
}

void down()
{
    int cnt=0;
    memset(record,0,sizeof(record));
    printf("Down\n");
    from(i,0,r)
    {
        from(j,0,c)
        {
            int x=i;
            if(i==0&&puzzle[i][j]!='*')
            {
                cnt++;
                if(!record[i][j]) printf("%3d.",cnt);
                else continue;
                while(puzzle[x][j]!='*'&&x<r)
                {
                    if(!record[x][j])
                    {
                        printf("%c",puzzle[x][j]);
                        record[x++][j]=1;
                    }
                    else break;
                }
                printf("\n");
                continue;
            }
            if(j==0&&puzzle[i][j]!='*')
            {
                cnt++;
                if(!record[i][j]) printf("%3d.",cnt);
                else continue;
                while(puzzle[x][j]!='*'&&x<r)
                {
                    if(!record[x][j])
                    {
                        printf("%c",puzzle[x][j]);
                        record[x++][j]=1;
                    }
                    else break;
                }
                printf("\n");
                continue;
            }
             if(puzzle[i][j]!='*'&&(puzzle[i][j-1]=='*'||puzzle[i-1][j]=='*'))
            {
                cnt++;
                if(!record[i][j]) printf("%3d.",cnt);
                else continue;
                while(puzzle[x][j]!='*'&&x<r)
                {
                    if(!record[x][j])
                    {
                        printf("%c",puzzle[x][j]);
                        record[x++][j]=1;
                    }
                    else break;
                }
                printf("\n");
                continue;
            }
        }
    }
    return ;
}

int main()
{
    int t=0;
    while(cin>>r)
    {
        if(r==0) break;
        cin>>c;
        getchar();
        from(i,0,r)
        gets(puzzle[i]);
        if(t) printf("\n");
        printf("puzzle #%d:\n",++t);
        across();//横向找
        down();//竖向找
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值