Facebook Hacker Cup 2014 Qualification Round 競賽試題 Square Detector 解題報告

  Facebook Hacker Cup 2014 Qualification Round比賽Square Detector題的解題報告。單擊這裏打開題目連接(國內訪問須要那個,你懂的)。php

  原題以下:ide

Square Detector

Problem Descriptionspa

You want to write an image detection system that is able to recognize different geometric shapes. In the first version of the system you settled with just being able to detect filled squares on a grid.code

You are given a grid of N×N square cells. Each cell is either white or black. Your task is to detect whether all the black cells form a square shape.orm

Inputxml

The first line of the input consists of a single number T, the number of test cases.blog

Each test case starts with a line containing a single integer N. Each of the subsequent N lines contain N characters. Each character is either "." symbolizing a white cell, or "#" symbolizing a black cell. Every test case contains at least one black cell.ip

Outputget

For each test case i numbered from 1 to T, output "Case #i: ", followed by YES or NO depending on whether or not all the black cells form a completely filled square with edges parallel to the grid of cells.input

Constraints

1 ≤ T ≤ 20
1 ≤ N ≤ 20

Example

Test cases 1 and 5 represent valid squares. Case 2 has an extra cell that is outside of the square. Case 3 shows a square not filled inside. And case 4 is a rectangle but not a square.

Sample Input

5
4
..##
..##
....
....
4
..##
..##
#...
....
4
####
#..#
#..#
####
5
#####
#####
#####
#####
.....
5
#####
#####
#####
#####
#####

Sample Output

Case #1: YES
Case #2: NO
Case #3: NO
Case #4: NO
Case #5: YES

 

 

 

 

  首先,置正方形狀態爲true,而後橫向掃描全部行,判斷從「.」到「#」的切換次數。切換次數大於一次的,置正方形狀態爲false,退出循環。若是每行的「#」起始座標或結束座標不一致,也置正方形狀態爲false,退出循環。接着,若是正方形狀態爲true,再縱向掃描全部列,與行掃描同樣的作法。最終,若是正方形狀態爲true,輸出YES;不然,輸出NO。

  C++語言代碼以下:

#include <cstdio>
#include <cstdlib>

#define MAX_LENGTH 100

using namespace std;

int main()
{
    bool square;
    int line_changes;
    int start_x, start_y, end_x, end_y;
    int T;
    static char s[MAX_LENGTH][MAX_LENGTH];
    scanf("%d", &T);
    for ( int i = 1; i <= T; ++ i )
    {
        int n;
        scanf("%d", &n);
        gets(s[0]);
        start_x = start_y = -1;
        for ( int j = 0; j < n; ++ j )
            gets(s[j]);
        square = true;
        for ( int j = 0; j < n; ++ j )
        {
            line_changes = 0;
            for ( int k = 0; k < n; ++ k )
            {
                if ( k == 0 && s[j][k] == '#' )
                    ++line_changes;
                if ( k > 0 && s[j][k] == '#' && s[j][k-1] == '.' )
                    ++line_changes;
                if ( line_changes > 1 )
                {
                    square = false;
                    break;
                }
                if ( s[j][k] == '#' )
                {
                    end_x = j;
                    end_y = k;
                    if ( start_x == -1 )
                    {
                        start_x = j;
                        start_y = k;
                    }
                }
            }
        }
        if ( end_y - start_y != end_x - start_x )
            square = false;
        for ( int col = 0; col < n; ++ col )
        {
            line_changes = 0;
            for ( int row = 0; row < n; ++ row )
            {
                if ( row == 0 && s[row][col] == '#' )
                    ++line_changes;
                if ( row > 0 && s[row][col] == '#' && s[row-1][col] == '.' )
                    ++line_changes;
                if ( line_changes > 1 )
                {
                    square = false;
                    break;
                }
            }
        }
        if ( square )
            printf("Case #%i: YES\n", i);
        else
            printf("Case #%i: NO\n", i);
    }
    return EXIT_SUCCESS;
}

 

 

  另外,Facebook Hacker Cup還公佈了官方的解法。官方解法是用Python語言寫的(用的是 Python 2 的語法),代碼以下:

def solve():
    n = int(raw_input().strip())
    b = [raw_input().strip() for i in range(n)]
    black = 0
    minX, maxX, minY, maxY = n, 0, n, 0
    for x in range(0, n) :
        for y in range(0, n) :
            if b[x][y] == '#':
                minX, minY  = min(minX, x), min(minY, y)
                maxX, maxY = max(maxX, x), max(maxY, y)
                black += 1
    dx = maxX - minX + 1
    dy = maxY - minY + 1
    return dx == dy and dx * dy == black

if __name__ == '__main__':
    t = int(raw_input().strip())
    for i in range(1, t+1):
        res = solve()
        print 'Case #%d: %s' % (i, 'YES' if res else 'NO')
相關文章
相關標籤/搜索