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
- uva--232(字符串模拟)
- uva 409(字符串模拟)
- UVA 156 Ananagrams (字符串模拟)
- uva--1368(贪心,字符串模拟)
- UVA 156 Ananagrams 模拟+字符串处理
- UVa 489 Hangman Judge (模拟&字符串匹配)
- uva 537 Artificial Intelligence?(字符串模拟)
- uva 409 Excuses, Excuses!(字符串模拟)
- uva 156 Ananagrams(字符串模拟搜索)
- UVA 156 Ananagrams 模拟+字符串处理
- UVA 706 LCD Display 液晶显示屏 (字符串模拟)
- UVa 227 Puzzle 【数组和字符串】【模拟】
- UVA 10815 【set的使用】【字符串模拟】
- UVA 156 【map的使用】【字符串模拟】
- UVA 232 字符串处理
- UVa 232 字符串处理、
- UVA 232 字符串处理
- UVA Andy's First Dictionary(模拟+字符串排序)
- hadoop常用操作命令
- linux netstat 笔记
- 可视化日历程序
- cocoapods version update!
- 写对称字母塔的时候,程序看起来都很复杂,但一步一步来,总是可以解决的!这个过程需要耐心!
- uva--232(字符串模拟)
- 同步,异步,阻塞,非阻塞IO
- robotium 找不到控件index解决办法
- SQL性能优化
- java 调用存储过程
- Linux SSH 登录其他机器
- vi/vim 光标移动命令
- 优先队列 - 堆
- usb battery 机制初探