其他分享
首页 > 其他分享> > UVA201 正方形 Squares 题解

UVA201 正方形 Squares 题解

作者:互联网

输入输出格式

输入格式

输入包含了多个游戏棋盘。每个棋盘包含了 n^2 个点的正方形矩阵 (其中 2 ≤ n ≤ 9),以及一些起连接作用的横向或纵向的线段。棋盘的的 n^2 个点和 m 条连接线段,格式如下:

第 1 行:n,表示矩阵中单行或单列的点的数目
第 2 行:m,表示连接线段的数目
接下来的 m 行,每行是以下两种格式之一:
(1) H i j 形式,表示第 i 行的横向线段,连接了第 j 列的点和它右边的第 j + 1 列的点;
(2) V i j 形式,表示第 i 列的纵向线段,连接了第 j 行的点和它下方的第 j + 1 行的点。

样例输入数据的第 1 组,对应于上面的图示棋盘。

输出格式

对于每组测试数据,输出 Problem #1, Problem #2 等标识,并输出棋盘上的各种大小的正方形数目,按正方形由小到大的顺序排列。如果不存在任何大小的正方形,则打印相应的提示消息。将各组测试数据以一行星号间隔,星号上下方各有一个空行。请参见示例的格式。

输入输出样例

输入 #1

4
16
H 1 1
H 1 3
H 2 1
H 2 2
H 2 3
H 3 2
H 4 2
H 4 3
V 1 1
V 2 1
V 2 2
V 2 3
V 3 2
V 4 1
V 4 2
V 4 3
2
3
H 1 1
H 2 1
V 2 1

输出 #1

Problem #1
2 square (s) of size 1
1 square (s) of size 2
**********************************
Problem #2
No completed squa

思路

分开存横边和竖边,先查size为1的正方形,从第一个顶点开始查,具体思路可以看代码

代码

#include <stdio.h>
#include <string.h>
#define maxn 15
// 分开储存
int r[maxn][maxn];
int c[maxn][maxn];
int main() {
	int n;
	int kase = 0;
	while (scanf("%d", &n) != EOF) {
		memset(r, 0, sizeof(r));
		memset(c, 0, sizeof(c));
        // 注意格式!!!
		if (kase > 0) {
			printf("\n");
			printf("**********************************\n\n");
		}
		int len;
		scanf("%d", &len);
		for (int k = 0; k < len; k++) {
			char ch;
			int i, j;
			getchar();
			scanf("%c", &ch);
			if (ch == 'H') {
				scanf("%d%d", &i, &j);
                // 有边则设置为1
				r[i][j] = 1;
			} else if (ch == 'V') {
				scanf("%d%d", &i, &j);
				c[i][j] = 1;
			}
		}
		int flag = 1;
		int all[n];
		memset(all, 0, sizeof(all));
		printf("Problem #%d\n\n", ++kase);
		int num = 0;
		for (int i = 1; i < n; i++) {
			for (int j = 1; j <= n * (n - i); j++) {
				flag = 1;
				for (int k = 0; k < i; k++) {
                    // 关键代码,判断边是否符合条件.
					if (r[(j - 1) / n + 1][(j - 1) % n + 1 + k] != 1 || r[(j - 1) / n + 1 + i][(j - 1) % n + 1 + k] != 1|| c[(j - 1) % n + 1][(j - 1) / n + 1 + k] != 1 ||c[(j - 1) % n + 1 + i][(j - 1) / n + 1 + k] != 1) {
						flag = 0;
						break;
					}
				}
				if (flag == 1) {
					all[i]++;
				}
			}
			if (all[i] > 0) {
				printf("%d square (s) of size %d\n", all[i], i);
				num++;
			}
		}
		if (num == 0) {
			printf("No completed squares can be found.\n");
		}
	}
	return 0;
}

标签:Squares,int,题解,scanf,maxn,printf,格式,Problem,UVA201
来源: https://blog.csdn.net/m0_63486615/article/details/122772982