题目:
输入一个输入一个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
0Outputpuzzle #1:
Across
1.AT
3.O
Down
1.A
2.TOpuzzle #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;
}