题不难,详细解释看代码注释,需要注意的就是序号的安排和输出时的空格,多看pdf,格式问题很重要
import java.util.*;
public class Main {
public static void main(String args[]) {
String st="";
Scanner reader = new Scanner(System.in);
int g=0,num=0,sum=0;//标记变量
while(reader.hasNextInt()){
int r=reader.nextInt();
if(r==0){break;}//读取到0,终止程序
int c=reader.nextInt();
reader.nextLine();//吞掉c后的换行
int e=0,f=0,x=0,y=0,m=0;//标记变量
g++;//标记标题的次数
char[][] d=new char[r][c];//存放输入的表格
int [][] p=new int[r][c];//存放序号
String str="";
for(int i=0;i<r;i++){
str=reader.nextLine();
for(int j=0;j<c;j++){
d[i][j]=str.charAt(j);
}
}//读入表格
if(g>1){System.out.println();}//除了第一个标题,在每两个连续的标题之间输出换行
System.out.println("puzzle #"+g+":");
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(i==0||j==0){
if(d[i][j]!='*'){m++;p[i][j]=m;}
}
else if(d[i-1][j]=='*'||d[i][j-1]=='*')
{
if(d[i][j]!='*') m++;p[i][j]=m;
}
}
}//序号标记
String s="";//答案序列
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(d[i][j]!='*'){
num++;
if(num==1){sum=p[i][j];}//把要输出的序列号提出
y=1;//表示进入循环,不存在全是*
s+=d[i][j];//把单词依次存放进字符串
}
if(d[i][j]=='*'||j==c-1){//如果读取到了*或者读到了数组边界
if(s.equals(st)){continue;}//如果直接遇到*,会读入空串,此时跳出循环,不进行输出
e++;
if(e==1){System.out.println("Across");}//确保只会在第一次输出横行单词前输出标题across
System.out.printf("%3d.%s\n",sum,s);
s="";//释放答案序列
num=0;//清空标记
}
}
}
if(y==0){
System.out.println("Across");//如果一次循环都没有进入,意味着此次全是*,继续输出一个across标题
}
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(d[i][j]!='*'){
x=1;
if(i==0){//如果不是*并且在第一行,必定会输出一个纵向单词
int k=0;
for(;;){
s+=d[i+k][j];
if(k==0){sum=p[i][j];}//把第一个单词的序号提出
k++;
if(i+k>=r||d[i+k][j]=='*'){break;}//一直读取到*或者数组边界
}
}
else if(d[i-1][j]=='*'){//如果该单词的上一个为*,该单词币可以输出一个纵向单词
int k=0;
for(;;){
s+=d[i+k][j];
if(k==0){sum=p[i][j];}//同上标记序号
k++;
if(i+k>=r||d[i+k][j]=='*'){break;}
}
}
}
if(s.equals(st)){continue;}
f++;
if(f==1){System.out.println("Down");}//与横向输出相同
System.out.printf("%3d.%s\n",sum,s);
s="";
}
}
if(x==0){System.out.println("Down");}
}
}
}