算法竞赛入门经典:UVA232 Crossword Answers(Java版)

题意:输入一个r 行c 列(1<r,.c<10) 的网格,黑格用“*”每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格 你的任务是找出网格中所有所有横向单词(Across)。.这些单词必须从一个起始格(左边是黑格,或是第一列) 开始,向右延伸到一个黑格的左边或者整个网格的最右列。然后找出所有竖向单词(Down)。 这些单词必须从一个起始格(上边是黑格,或是第一行) 开始,向下延伸到一个黑格的上边或者整个网格的最下行。(纵横字谜)

思路:定义字符串数组和整形数组分别存放字母和数字,起始格的判断以及遇黑格时的数字数组的处理,最后输出即可。注意每例前要空一行的格式问题,数组的大小设置。

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        int count=0;
        while(in.hasNext()){
            int r=in.nextInt();
            if(r==0)  break;
            int c=in.nextInt();
            char[][] b=new char[12][12];//存放字符网格
            int[][] num=new int[12][12];
            int m=1;
            for(int i =0;i<r;i++) {
                String s=in.next();
                for(int j=0;j<c;j++) {
                    b[i][j]=s.charAt(j);
                    if(b[i][j]!='*'){//起始格判断以及跳过黑格              
                        if(i==0||j==0||b[i-1][j]=='*'||b[i][j-1]=='*')
                            num[i][j] = m++;                
                        }
                    }
                }
            if(++count>1){
                System.out.println();//注意格式
            }
            System.out.println("puzzle #"+count+":");
            System.out.println("Across");//横行
            for(int i=0;i<r;i++){
            	int j=0;
            	while(j<c){
            		 if(num[i][j]==0||b[i][j] =='*')  
                     {  
                         j++; 
                         continue;  
                     }     
            		 System.out.printf("%3d.%c",num[i][j],b[i][j]);
                     j++;  
                     while(j<c&&b[i][j]!='*')
                     {  
                      System.out.printf("%c",b[i][j]);  
                         j++;
                     }
                     System.out.println();
            	}
            }
            System.out.println("Down");//纵行
            for(int i=0;i<r;i++){
            	for(int j=0;j<c;j++){
            		if(num[i][j]==0||b[i][j]=='*')
            			  continue;
            		 System.out.printf("%3d.%c",num[i][j],b[i][j]);	
            	     num[i][j]=0;  
                     int x=i+1;  
                     while(x<r&&b[x][j]!='*') 
                     {  
                    	 System.out.printf("%c",b[x][j]);  
                         num[x][j]=0; 
                         x++;  
                     } 
                     System.out.println();
            	}
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值