欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-19 19:01:10
...

一、题目

【算法竞赛 入门经典】习题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;
}