您的位置:首页 > 其它

习题3-6 纵横字谜的答案(Crossword Answers) UVa 232

2017-08-19 17:44 477 查看
题目:

输入一个输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…。接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题

Input

2 2

AT

*O

6 7

AIM*DEN

*ME*ONE

UPON*TO

SO*ERIN

*SA*OR*

IES*DEA

0
Output

puzzle #1:

Across

  1.AT

  3.O

Down

  1.A

  2.TO
puzzle #2:

Across

  1.AIM

  4.DEN

  7.ME

  8.ONE

  9.UPON

 11.TO

 12.SO

 13.ERIN

 15.SA

 17.OR

 18.IES

 19.DEA

Down

  1.A

  2.IMPOSE

  3.MEO

  4.DO

  5.ENTIRE

  6.NEON

  9.US

 10.NE

 14.ROD

 16.AS

 18.I

 20.A

实现:
#include<stdio.h>
#include<string.h>
#define maxn 15

int main()
{
int num[maxn][maxn];
char buf[maxn][maxn];
int r, c;
int kcase = 0;
//freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);
//freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout);
while(scanf("%d",&r) == 1 && r != 0){
scanf("%d",&c);
memset(num, 0, sizeof(num));
int i,j;
int cnt = 1;
for(i = 0; i < r; i++ ){
scanf("%s",buf[i]);// 二维字符数组 输入
}
for(i = 0; i < r; i++ ){
for(j = 0; j <c; j++ ){
if(buf[i][j] == '*')
continue;
if(j == 0 || i == 0 || buf[i-1][j] == '*' || buf[i][j-1] == '*')//这几种情况 是起始点
num[i][j] = cnt++;
}
}
if(kcase++)
printf("\n");
printf("puzzle #%d:\n",kcase);
printf("Across\n");
for(i = 0; i < r; i++ ){
j = 0;
while(j < c){
if(num[i][j] == 0 || buf[i][j] == '*'){// num[][] 为 0 表示不是起始点 //同时不为黑格
j++;
continue;
}
printf("%3d.%c",num[i][j],buf[i][j]);
j++;
while(j < c && buf[i][j] != '*'){
printf("%c",buf[i][j]);
j++;
}
printf("\n");
}
}

printf("Down\n");
for(i = 0; i < r; i++ ){
for(j = 0; j < c; j++){
if(num[i][j] == 0 || buf[i][j] == '*'){
continue;
}
printf("%3d.%c",num[i][j],buf[i][j]);
num[i][j] = 0;
int k = i+1;
while(k < r && buf[k][j] != '*'){
printf("%c",buf[k][j]);
num[k][j] = 0;// 如果在同一列 并且中间无 黑格算 一整个单词 然后 这里就不能算作起始点了 所以 置 0
k++;
}
printf("\n");
}
}
}

return 0;
}

这个答案是参考别人的。

下面这个是我自己写的 (但是PE 格式不对 懒得找哪个地方格式不对了 但是结果对的)

#include<stdio.h>
#define maxn 20
typedef struct Grid{
char c;
int num;
}Grid;
Grid a[maxn][maxn];
int main()
{
int kcase = 0;
int r, c;
//		freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);
//		freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout);
while(scanf("%d",&r) == 1 && r != 0){
scanf("%d",&c);
getchar();// 读取整数时候会有 换行符
for(int i = 0; i < r; i++ ){
for(int j = 0; j < c; j++ ){
scanf("%c",&a[i][j].c);
}
getchar();
}
for(int i = 0; i < r; i++ ) {  //初始化 数组
for(int j = 0; j < c; j++ ){
a[i][j].num = 0;
}
}

int cnt = 1;
for(int i = 0; i < r; i++ ){
for(int j = 0; j < c; j++ ){
if(i == 0 && a[i][j].c != '*'){
a[i][j].num = cnt++;
}
else if(j == 0 && i != 0 && a[i][j].c != '*'){
a[i][j].num = cnt++;
}
else{
if(a[i][j].c != '*' && (a[i-1][j].c == '*' || a[i][j-1].c == '*'))
a[i][j].num = cnt++;
}
}
}
int i, j, k;
if(kcase++)
printf("\n");
printf("puzzle #%d:\n",kcase);
printf("Across\n");
int count;
int flag;
for(i = 0; i < r; i++ ){
count = 0;
flag = 0;
for(j = 0; j < c; j++ ){
if(a[i][j].c != '*'){
count++;
flag = 1;
if(count == 1)
printf("%3d.%c",a[i][j].num,a[i][j].c);
else
printf("%c",a[i][j].c);
}
else if(a[i][j].c == '*'){
if(flag && j != c-1){
flag = 0;
putchar('\n');
}
count = 0;
}
}
putchar('\n');
}
int flag1;
int count1;
int i_pos, j_pos;
printf("Down\n");
for(int k = 1; k < cnt; k++ ){
flag1 = 0;
count1 = 0;
for(int i = 0; i < r; i++ ){
for(int j = 0; j < c; j++ ){
if(a[i][j].num == k){
for(int m = i; a[m][j].c != '*' && m < r; m++){
count1++;
flag1 = 1;
a[m][j].num = 0;
if(count1 == 1)
printf("%3d.%c",k,a[i][j].c);
else
printf("%c",a[m][j].c);
}
}
}
}
if(flag1)
putchar('\n');
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva 网格 UVa 232