题意:输入一个r 行c 列(r大于1,.c小于10) 的网格,黑格用“*”每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格
你的任务是找出网格中所有所有横向单词(Across)。.这些单词必须从一个起始格(左边是黑格,或是第一列) 开始,向右延伸到一个黑格的左边或者整个网格的最右列。然后找出所有竖向单词(Down)。
这些单词必须从一个起始格(上边是黑格,或是第一行) 开始,向下延伸到一个黑格的上边或者整个网格的最下行。
输入:
有多个矩阵输入,每一个矩阵都是以RC 开始(r大于1,c小于10),表示R 行C 列,然后下面紧跟着一个R 行C 列的矩阵,里面全部是大写字母或是*,以,C 代表所有矩阵输入结束。
思路:前期准备工作:先将输入的字符内容存入二维字符数组内,再创建一个整形的二维数组用于标记序号(将字符二维数组看成如上图的方格,循环查找,只要该格子是在第一行或第一列,或不是第一行第一列但上边格子为“星号”,或不是第一行第一列但左边格子为“星号”,则从1依次递增标记在整形数组对应的位置内)。横向输出:直接循环输出字符内的内容,遇到“星号”直接换行,到了行尾加个换行,如果是第1列则输出该位置整形中的序号,如果是“星号”且下一个格子不是“星号”则输出下一个格子内的序号。纵向输出:再次创建一个二维整形数组,除第一行外,如果字符数组内该格子是“星号”则将之前标记序号的二维数组该格子中的数字赋值格这次新建的整形数组内,然后循环输出,如果新的整形二维数组内该格子不为空,输出其内容,再向下循环输出二维字符数组中的内容,如果新的整形二维数组内容再次不为空,则结束输出并换行,依次一行一行的循环即可得到最后结果。(这个方法虽然看着很不简洁,但比较容易理解,也比较容易想到,哈哈哈)
遇到的问题:
- 纵向的输入问题,纵向输出并不是像横向输出一样,遇到“星号”便换行即可,因为不需要考虑到它的序号顺序,而纵向输出若想按照序号顺序输出则需重新排列。
- 输出格式问题:注意细节。
import java.util.Scanner;
import java.lang.String;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int kk=1;
while (true) {
int r = sc.nextInt();
if (r == 0)
break;
int c = sc.nextInt();
char car[][] = new char[r][c];
int iar[][] = new int[r][c];
int tem = 0;
for (int i = 0; i < r; i++) {
String s = sc.next();
s += sc.nextLine();
for (int j = 0; j < c; j++) {//将字符串s内的数字依次传给字符二维数组car
car[i][j] = s.charAt(j);
if (car[i][j] != '*')
{if (i == 0 || j == 0)//如果是第一行或第一列,将序号标记到iar相对应的位置内
iar[i][j] = ++tem;
else if (car[i - 1][j] == '*' || car[i][j - 1] == '*')//如果不是第一行,则判断该位置的上一格是否为“星号”或者左边的格子是否为“星号”,是的话标记
iar[i][j] = ++tem;
}
}
}
if (kk > 1)
System.out.println();
System.out.println("puzzle #" + kk++ + ":");
System.out.println("Across");
// int t = 0;
// char array[] = new char[9];
for (int i = 0; i < r; i++)//循环依次输出字符,遇到“星号”回车
for (int j = 0; j < c; j++)
if (car[i][j] != '*') {
if (j == 0)
System.out.print(String.format("%3d", iar[i][j]) + ".");
System.out.print(car[i][j]);
if(j==c-1)
System.out.println();
}
else {
if (j != 0 && car[i][j - 1] != '*')
System.out.println();
if (j != c - 1 && car[i][j + 1] != '*')
System.out.print(String.format("%3d", iar[i][j + 1]) + ".");
}
System.out.println("Down");
int iarr[][] = new int[r][c];//创建新的整型数组,只装该位置上方为“星号”的序号
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++) {
if (car[i][j] != '*') {
if (i == 0)
iarr[i][j] = iar[i][j];
else if (car[i - 1][j] == '*')
iarr[i][j] = iar[i][j];
}
}
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
if (iarr[i][j] != 0) {//该数组的序号非零这输出,遇到“星号”结束
System.out.print(String.format("%3d", iarr[i][j]) + ".");
for (int k = i; k < r; k++) {
if (car[k][j] != '*') {
System.out.print(car[k][j]);
if (k == r - 1)
{
System.out.println();
break;
}
} else {
System.out.println();
break;
}
}
}
}
}
}