输入一个r 行c 列(1<r,.c<10) 的网格,黑格用“*”每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格 你的任务是找出网格中所有所有横向单词(Across)。.这些单词必须从一个起始格(左边是黑格,或是第一列) 开始,向右延伸到一个黑格的左边或者整个网格的最右列。然后找出所有竖向单词(Down)。 这些单词必须从一个起始格(上边是黑格,或是第一行) 开始,向下延伸到一个黑格的上边或者整个网格的最下行。 输入: 有多个矩阵输入,每一个矩阵都是以RC 开始(1<r,c<10),表示R 行C 列,然后下面紧跟着一个R 行C 列的矩阵,里面全部是大写字母或是*,以,C 代表所有矩阵输入结束。
思路:本题难点在于初始格子的标记以及输出,本人的思路就是首先输入一个二位数组,然后根据初始格子的定义以及输入的数据,先标记好初始格子,然后再横向纵向的找出字母,然后再把初始格子的序号和横向纵向的答案序列分别赋值给两个变量,在进行输出
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String K = "";
int a = 0;
int ans1 = 0;// 用来存放答案序列前面的序号
while (input.hasNext()) {
int b = 0, d = 0, e = 0, x = 0, f = 0, A = 0, B = 0;
int r = input.nextInt();
a++;
if (r == 0) {
break;// 控制输入合法,不合法则break
}
int c = input.nextInt();
input.nextLine();
char[][] gz = new char[r][c];// 创建一个游戏的二维数组
for (int i = 0; i < r; i++) {
String strl1 = input.nextLine();// 存入一个一维横向数组
for (int j = 0; j < c; j++) {
gz[i][j] = strl1.charAt(j);// 再把一个一维数组遍历成二位数组
}
} // 输入二维游戏格子
if (a > 1) {
System.out.println();
}
System.out.println("puzzle" + " " + "#" + a + ":");
int[][] csgz = new int[r][c];// 用于存放二维数组里面初始格子
int m = 0;// 用于标记初始格子
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (i == 0 || j == 0) {// 边界
if (gz[i][j] != '*') {// 起始格不能是*,则要排除
m++;
csgz[i][j] = m;
}
} else {
if (gz[i - 1][j] == '*' || gz[i][j - 1] == '*') {// 起始格不能是*
if (gz[i][j] != '*') {
m++;
csgz[i][j] = m;
}
}
}
}
} // 标记初始格子
String ans2 = "";// 用来存放横向或纵向的答案序列(当存放横向序列之后清空,即可存放纵向序列)
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (gz[i][j] != '*') {
A=1;
d++;
if (d == 1) {
ans1 = csgz[i][j];// 提取答案序号
}
ans2 += gz[i][j];// 提取答案序列
}
if (gz[i][j] == '*' || j == c - 1) {// 当横向遍历碰到*,或者碰到数组边界(输入的纵向边界c)的时候。
if (ans2.equals(K)) {
continue;
} // 如果直接遇到*,会读入空串,此时跳出循环,不进行输出
b++;
if (b == 1) {
System.out.println("Across");
} // 保证Across只输出一次e
System.out.printf("%3d.%s\n",ans1,ans2);
ans2 = "";
//b = 0;// 将控制Across输出的变量置为0;保证Across只输出一次
d = 0;
}
}
} // 求出横向答案序列
if(A==0){
System.out.println("Across");
}
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(gz[i][j]!='*'){
B=1;
if(i==0){//如果不是*并且在第一行,必定会输出一个纵向单词
int k=0;
for(;;){
ans2+=gz[i+k][j];
if(k==0){ans1=csgz[i][j];}//把第一个单词的序号提出
k++;
if(i+k>=r||gz[i+k][j]=='*'){break;}//一直读取到*或者数组边界
}
}
else if(gz[i-1][j]=='*'){//如果该单词的上一个为*,该单词币可以输出一个纵向单词
int k=0;
for(;;){
ans2+=gz[i+k][j];
if(k==0){ans1=csgz[i][j];}//同上标记序号
k++;
if(i+k>=r||gz[i+k][j]=='*'){break;}
}
}
}
if(ans2.equals(K)){continue;}
f++;
if(f==1){System.out.println("Down");}//与横向输出相同
System.out.printf("%3d.%s\n",ans1,ans2);
ans2="";
}
}// 纵向答案序列
if(B==0){
System.out.println("Down");
}
}
}
}