题意:输入一个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();
}
}
}
}
}