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(); } }