UVa 201 Squares

Squares

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknownphp

UVa 201
UVa 201


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2018/01/02

#include "stdio.h"
#include "string.h"

struct node {
    int flagh;     // 該點下方是否有線
    int flagv;     // 該點右邊是否有線
};

int main() {
    int n, m;
    int count = 0;
    while (scanf("%d%d", &n, &m) != EOF) {
        getchar();
        count += 1;
        int ans[10] = { 0 };
        node a[10][10];
        memset(a, 0, sizeof(a));
        for (int i = 0; i < m; i++) {     //錄入數據
            char ch = getchar();
            int x, y;
            if (ch == 'H') {
                scanf("%d%d", &x, &y);
                a[x][y].flagh = 1;
            }
            else if (ch == 'V') {
                scanf("%d%d", &y, &x);
                a[x][y].flagv = 1;
            }
            getchar();
        }
        for (int i = 1; i < n; i++) {     // 控制掃描規格
            for (int k = 1; k <= n - i; k++) {     // 控制行
                int limv = k + i - 1;     // 垂直最深處
                for (int t = 1; t <= n - i; t++) {     // 控制列
                    int limh = t + i - 1;     // 水平最遠處
                    int flag = 1;
                    int kk = k, tt = t;
                    // 回型檢查是否有線
                    for (; kk <= limv && flag; kk++) {
                        if (!a[kk][tt].flagv)
                            flag = 0;
                    }
                    for (; tt <= limh && flag; tt++) {
                        if (!a[kk][tt].flagh)
                            flag = 0;
                    }
                    kk -= 1;
                    for (; kk >= k && flag; kk--) {
                        if (!a[kk][tt].flagv)
                            flag = 0;
                    }
                    kk += 1;
                    tt -= 1;
                    for (; tt >= t && flag; tt--) {
                        if (!a[kk][tt].flagh)
                            flag = 0;
                    }
                    if (flag) {
                        ans[i] += 1;
                    }
                }
            }
        }
        int tag = 0;     // 檢查是否有解
        for (int i = 1; i < n; i++) {
            if (ans[i]) {
                tag = 1;
                break;
            }
        }
        if (count != 1) {
            printf("\n**********************************\n\n");
        }
        printf("Problem #%d\n\n", count);
        if (tag) {
            for (int i = 1; i < n; i++) {
                if (ans[i]) {
                    printf("%d square (s) of size %d\n", ans[i], i);
                }
            }
        }
        else {
            printf("No completed squares can be found.\n");
        }
    }
    return 0;
}

Notes

題意:
有 n 行 n 列的小黑點,還有 m 條線段鏈接其中的一些黑點。統計這些線連成了多少個正方形(每種邊長分別統計)。node

思路:
定義一個描述節點的結構,描述它的右邊和下方是否有線。
按題意模擬掃描過程便可。算法

算法:
第一步:錄入數據時,把連線的過程簡化成描述該點的右邊和下方是否有線。
第二步:掃描正方形:首先肯定規格,而後肯定起始點(即左上角的點),最後轉一個回型檢查是否全都有線。spa

感覺:
輸入的時候要注意吸取回車符。
輸入縱向的線注意橫縱座標的前後。
掃描的過程要先想清楚循環怎麼套再下手。
走點的時候要注意什麼時候該把點往回拉。code

相關文章
相關標籤/搜索