【算法竞赛 入门经典】习题3-6 纵横字谜的答案(Uva232)

一、题目

在这里插入图片描述

二、解题思路

首先是输入这个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;
}
发布了91 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/gyx1549624673/article/details/103158139