uva--232(字符串模拟)

来源:互联网 发布:剑灵可爱灵女捏脸数据 编辑:程序博客网 时间:2024/04/28 05:15

点击打开链接


这是一道字符串模拟题,题意大概是给定一个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 1000000007using 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;}


0 0
原创粉丝点击