【算法竞赛 入门经典】习题3-6 纵横字谜的答案(Uva232)
程序员文章站
2024-03-19 19:01:10
...
一、题目
二、解题思路
首先是输入这个r行c列的网格,用str二维数组保存,然后标记出符合条件的初始格用flag数组保存,然后按要求进行遍历输出 。
要注意的是输出的格式
横向的是所有以起始格开始到黑格或者一行末尾的单词都要输出;但是纵向的只需要输出一个从起始格到黑格或者一列末尾的单词。
单词前面是开头初始格的序号。
三、代码
#include<stdio.h>
#include<string.h>
char str[15][15];
int flag[15][15];//用于标记符合条件的起始格
int main(){
int r,c;
int cnt=1;
while((scanf("%d",&r)!=EOF) && r!=0){
scanf("%d",&c);
getchar(); //注意用这个吃掉换行~~
int num=0;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
str[i][j]=getchar(); //边输入边判断
if(str[i][j]!='*' && (j==0 || i==0 || (str[i-1][j]=='*' && i>0) || (str[i][j-1]=='*' && j>0))){
num++;
flag[i][j]=num;
}
}
getchar();// 吃掉换行
}
if(cnt>1){
printf("\n");
}
printf("puzzle #%d:\nAcross\n",cnt++);
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(str[i][j]!='*' &&((str[i][j-1]=='*'&&j>0) ||j==0)){
printf("%3d.",flag[i][j]);
int l;
for(l=j;str[i][l]!='*' && l<c;l++){
printf("%c",str[i][l]);
}
printf("\n");
j=l; //用l记录进行到哪一个格了
}
}
}
printf("Down\n");
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(str[i][j]!='*' && ((str[i-1][j]=='*' && i>0) || i==0)){
printf("%3d.",flag[i][j]);
for(int l=i;str[l][j]!='*'&&l<r;l++){
printf("%c",str[l][j]);
}
printf("\n");
}
}
}
}
return 0;
}
上一篇: 绘制UML图