UVA232 Crossword Answers Java题解

题不难,详细解释看代码注释,需要注意的就是序号的安排和输出时的空格,多看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");}
                }
            }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值