这是一道字符串模拟题,题意大概是给定一个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; }
具体代码如下:
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 00:06:04