《算法竞赛入门(第二版)》--java实现.3.2字符数组.纵横字谜的

        之前没有发现这是一本C语言编写得书,但本人还未学习过C语言,只能尝试用java实现书中的代码,在此记录学习这本书的历程。

       本人新手菜鸟,能力有限,如果有误或者有改进的地方欢迎指出,谢谢\(▔▽▔)/。

题目:输入一个r行c列(1<=r,c<=10)的网格,黑格用"*"表示,每个摆个都填有一个字母。如果一个摆个的左边相邻位置或者上边相邻位置没有白格(可能是黑格也可能是出了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上至下、从左至右的顺序编号为1,2,3......,如图所示。接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最有列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出样例如图所示。

 public static void main(String args[]) {
    	Scanner input = new Scanner(System.in);
    	int number1 = input.nextInt();
    	while(number1 != 0) {
    		int number2 =input.nextInt();
    		input.nextLine();
    		//将字符数组扩大,可以不用考虑超出数组时报错的情况
    		char [][]answer = new char[number1+2][number2+2];
    		clean(answer);
    		int [][]number = new int[number1][number2];
    		int key = 1;
    		int count = 1;//次序
    		int counts = 1;//起始格号数
    		while(key < number1+1) {
    			String a = input.nextLine();
    		    for(int n = 0;n < a.length();n++) {  //n为number序号、字符串序号,answer序号-1
		    		answer[key][n+1] = a.charAt(n);
    		    	if((answer[key][n] == '*' || answer[key][n] == ' ' 
    		    			|| answer[key - 1][n+1] == '*' || answer[key - 1][n+1] == ' ') 
    		    			&& answer[key][n+1] != '*') {
    		    		number[key-1][n] = counts++;
    		    	}
    		    }
    		    key++;
    		}
    		System.out.println("puzzle #"+ ++count + ":");
    		System.out.println("Across");
    		//输出所有横向单词
    		for(int i = 0;i < number.length;i++) {//换行
    			for(int n = 0;n < number[i].length;n++) {//输出该行的所有横向单词
    				if(number[i][n] != 0  && answer[i+1][n+1] != '*') {
    					System.out.print("  "+number[i][n]+".");
    					do {
    						System.out.print(answer[i+1][n+1]);
    						n++;
    					}while(n < number[i].length && answer[i+1][n+1] != '*');
    					System.out.println();
    				}
    			}
    		}
    		System.out.println("Down");
    		//输出所有竖向单词
    		for(int i = 0;i < number.length;i++) {
    			int a = i; //保存i的值,便于换下一列时仍在同一行
    			for(int n = 0;n < number[0].length;n++) {
    				if(n < number[0].length && number[i][n] != 0 && answer[i+1][n+1] != '*') {
    					System.out.print("  "+number[i][n]+".");
    					do {//输出该竖向单词
    						System.out.print(answer[i+1][n+1]);
    						answer[i+1][n+1] = '*';
    						i++;
    					}while(i < number.length && answer[i+1][n+1] != '*');
    					i = a;
    					System.out.println();
    				}
    			}
    		}
    		    		
    		number1 = input.nextInt();
    	}
    }
    
    //将字符数组初始化
    public static void clean(char[][]answer) {
    	for(int i = 0;i < answer.length;i++) {
    		for(int n = 0;n < answer[i].length;n++) {
    			answer[i][n] = ' ';
    		}
    	}
    }

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值