习题4-2 正方形(Squares, ACM/ICPC World Finals 1990, UVa201)
#include<bits/stdc++.h> using namespace std; int n,m,cnt = 0,a,b; char ch; int main(){ while(cin >> n >> m){ int h[10][10] = {0},v[10][10] = {0}; while(m--){ cin >> ch >> a >> b; if(ch == 'H') h[a][b] = b + 1; else v[b][a] = b + 1; } int right[10][10] = {0},down[10][10] = {0},num[10] = {0}; for(int i = 1;i <= n;i++){ for(int j = n - 1;j >= 1;j--){ right[i][j] = (h[i][j] == j + 1)? right[i][j + 1] + 1 : 0; down[j][i] = (v[j][i] == j + 1)? down[j + 1][i] + 1 : 0; } } for(int l = 1;l <= n;l ++) { for(int i = 1;i <= n - 1;i ++) { for(int j = 1;j <= n - 1;j ++) { if(right[i][j] >= l && down[i][j] >= l && down[i][j + l] >= l && right[i + l][j] >= l)num[l]++,num[0] = 1; } } } if (cnt != 0) printf("\n**********************************\n\n"); // 以下为输出 printf("Problem #%d\n\n", ++cnt); for (int i = 1; i <= n; i ++) if (num[i] != 0) printf("%d square (s) of size %d\n", num[i], i); if (num[0] == 0) printf("No completed squares can be found.\n"); } return 0; }