Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknownphp
https://uva.onlinejudge.org/i...
// 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; }
題意:
有 n 行 n 列的小黑點,還有 m 條線段鏈接其中的一些黑點。統計這些線連成了多少個正方形(每種邊長分別統計)。node
思路:
定義一個描述節點的結構,描述它的右邊和下方是否有線。
按題意模擬掃描過程便可。算法
算法:
第一步:錄入數據時,把連線的過程簡化成描述該點的右邊和下方是否有線。
第二步:掃描正方形:首先肯定規格,而後肯定起始點(即左上角的點),最後轉一個回型檢查是否全都有線。spa
感覺:
輸入的時候要注意吸取回車符。
輸入縱向的線注意橫縱座標的前後。
掃描的過程要先想清楚循環怎麼套再下手。
走點的時候要注意什麼時候該把點往回拉。code