这题首先想到用二维数组,首先设置一个String类型的变量,然后通过通过循环一个一个便利,这个二维数组需要循环两边,第一遍,判断右边是否是字母,第二遍判断空格下边是否为字母。然后输出,值得注意的是,要注意判断数据发生重复和边界的问题。建一个二维数组来存储数字的位置。
package smail;
import java.util.Scanner;
public class UVA232 {
public static void main(String[] args){
char[][] c;
Scanner in = new Scanner(System.in);
int ans = 1;
while (in.hasNext()) {
// 数据输入
int x1 = in.nextInt();
if (x1 == 0)
System.exit(0);
int x2 = in.nextInt();
c = new char[x1][x2];
for (int i = 0; i < x1; i++) {
String ans1 = in.nextLine();
if (ans1.length() == x2) {// 防止下标越界
char cc[] = ans1.toCharArray();
for (int j = 0; j < x2; j++) {
c[i][j] = cc[j];
}
}
}
// 数据处理和输出
int[][] ar = new int[x1][x2];
int sum = 0;
for (int i = 0; i < x1; i++) {
for (int j = 0; j < x2; j++) {
if (i == 0 || j == 0) {
if (c[i][j] != '*') {
sum += 1;
ar[i][j] = sum;
}
} else if (c[i - 1][j] == '*' && c[i][j] != '*' || c[i][j - 1] == '*' && c[i][j] != '*') {
sum += 1;
ar[i][j] = sum;
} else
ar[i][j] = 0;
}
}
//拷贝一份二维数组
char[][] d =new char [x1][x2];
for(int i = 0;i<x1;i++) {
for(int j = 0;j<x2;j++) {
d[i][j] = c[i][j];
}
}
if(ans!=1)
System.out.println();
System.out.println("puzzle #" + ans + ":");
//输出横向
System.out.println("Across");
for (int i = 0; i < x1; i++) {
String strl = "";
for (int j = 0; j < x2; j++) {
if (c[i][j] != '*') {
strl += c[i][j];
for (int k = j + 1; k < x2; k++) {
if (c[i][k] != '*') {
strl += c[i][k];
// System.out.println(strl);
c[i][k] = '*';
} else {
break;
}
}
if(ar[i][j]>=10)
System.out.println(" "+ar[i][j] + "." + strl);
else
System.out.println(" "+ar[i][j] + "." + strl);
strl = "";
}
}
}
//输出Down
String CAA = "";
System.out.println("Down");
for (int i = 0; i < x1; i++) {
for (int j = 0; j < x2; j++) {
if (d[i][j] != '*') {
CAA += d[i][j];
// System.out.println(strl);
for (int k = i + 1; k < x1; k++) {
if (d[k][j] != '*') {
CAA += d[k][j];
// System.out.println(strl);
d[k][j] = '*';
} else {
break;
}
}
if(ar[i][j]>=10)
System.out.println(" "+ar[i][j] + "." + CAA);
else
System.out.println(" "+ar[i][j] + "." + CAA);
CAA = "
}
}
}
ans++;
}
}
}