Uva201 Squares

本文介绍了一种通过枚举法查找给定网格中所有可能存在的正方形的方法。使用两个二维数组分别记录水平边和垂直边的存在情况,然后通过双重循环检查不同大小的正方形是否存在。适用于竞赛编程和算法学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 *未按照题目的格式。

/*整体思路:枚举法,扫描全部的点,用size代表每次检查的正方形边长,依次检查是否满足题意*/

#include<iostream>
using namespace std;
int H[10][10];
int V[10][10];
void Edge(char Edge,int i,int j){
	if (Edge == 'H'){
		H[i][j] = 1;
	}
	if (Edge == 'V'){
		V[i][j] = 1;
	}
}
int main()
{
	int n, number;//边长,边数
	int x, y;//坐标
	char edge;
	cin >> n >> number;
	while (number--){
		cin >> edge >> x >> y;
		Edge(edge, x, y);
	}
	int exist = 0, sign = 1;
	for (int size = 1; size <n; size++)
	{
		int count = 0;
		for (int i = 1; i + size <= n; i++)
		for (int j = 1; j + size <= n; j++)
		{
			  sign = 1;
			for (int p = j; p < j + size;p++)
			{
				if (H[i][p] != 1 || H[i + size][p] != 1){//检查(2*size)条平行边是否都存在. p使其往右移动,size往下移动检查
					sign = 0;
					break;
				}
			}
			if (sign)
			{
				for (int p = i; p < i + size; p++)
				{
					if (V[p][j] != 1 || V[p][j + size] != 1) //垂直边从上往下相连,所以"连续"变化的应该是‘行’p+1, i+size"跨越"变化应该是‘列’
					{
						sign = 0;
						break;
					}
				
				}
			}
			if (sign)
			{
				count++;
				exist=1;
			}
		}
		if (sign){

			cout << "The number of size<" << size << ">is:" << count++ << endl;	
		}
	}
	if (!exist)
	{
		cout << "No exist" << endl;
	}

	system("pause");
	return 0;
}

提供如下控制台输入,直接复制即可.

3 12
H 1 1
H 1 2
H 2 1
H 2 2
H 3 1
H 3 2
V 1 1
V 1 2
V 1 3
V 2 1
V 2 2
V 2 3


4 4
H 1 1
H 2 1
V 1 1
V 1 2 






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 1 2
V 1 4
V 2 2
V 2 3
V 2 4
V 3 2
V 3 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值