Facebook Hacker cup Qualification round Problem 1

前几天看到Facebook 主办的比赛,题目还是比较有意思的,废话少说,直接上题

题目如下:输入为 "#" 和 "." 构成的M*M的矩形,判断在图中由所有”#“构成的图形是否为实心正方形。为矩形则输出”YES“,否则输出”NO“

比如:

..##

..##

....

....       输出为 YES

但是这个

..##

..##

#...      输出为 NO 因为题目要求是所有"# "构成的图形

.... 

这个也不行

..###

..###

..#.#      输出为 NO 因为题目要求是所有"#" 构成的图形

.....

.....

如果觉得题目有意思,建议把你的chrome 最小化,自己动手试试

本人利用正则表达式进行匹配,并已经通过测试

代码如下:

import java.util.*;
import java.io.*;
import java.math.*;

public class SquareDetector {

    void solve(Scanner sc, PrintWriter pw) {
        int N = sc.nextInt();
        String[] a = new String[N];
        // 1 stands for # 
        for(int i = 0; i < N;i++) 
          a[i] = sc.next();
          int i = 0;
          boolean tag = false;
          int count = 0;
          boolean isFound = false;

        while(i < N){
            if(a[i].matches("(\\.)*#+(\\.)+#+(\\.)*")) {pw.println("NO");return;}
            else if(!tag){
                if(a[i].matches("(\\.){" + N + "}")){ i++;}
                else if(a[i].matches("(\\.)*#+(\\.)*")){
                    int j = 0;
                    while(j < N){
                        if(a[i].charAt(j++) == '#'){
                            count++;
                            System.out.println(count);
                            System.out.println(i);

                            if(i + count-1 >= N) { pw.println("NO"); return; }
                            else if(!a[i].equals(a[i+count-1])){pw.println("NO");return;}   
                            isFound = true;                            
                        }
 
                        else j++;                
                    }
                    if(isFound){
                        int index = i+count;
                        if(index < N){
                            if(!a[index].matches("(\\.){" +N +"}")){pw.println("NO");return;}
                         }
                    }   
                    i++;                  
                    pw.println("YES");
                    return;
                }
            }           
        }
        pw.println("NO");

    }

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(new FileReader("square_detector.txt"));
        PrintWriter pw = new PrintWriter(new FileWriter("output.txt"));
        int caseCnt = sc.nextInt();
        for (int caseNum=0; caseNum<caseCnt; caseNum++) {
            System.out.println("Processing test case " + (caseNum + 1));
            pw.print("Case #" + (caseNum+1) + ":");
            new SquareDetector().solve(sc, pw);
        }
        pw.flush();
        pw.close();
        sc.close();
    }
}

 

 

转载于:https://www.cnblogs.com/yeek/p/3442473.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值