您的位置:首页 > 其它

小紫书 4-2 UVA 201 Squares

2016-01-31 13:57 405 查看
给一些点和点之间的连线,问共有多少个正方形,写出每个边长为k的正方形共有多少个

枚举,枚举每个点作为一个正方形的左上顶点,然后依次枚举边的长度,看看能否形成一个正方形即可。

代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
bool row[10][10], column[10][10];
int ans[10];
int main()
{
//freopen("input.txt", "r", stdin);
int n, m, p = 0;
while (scanf("%d%d", &n, &m) != EOF)
{
memset(row, 0, sizeof(row));
memset(column, 0, sizeof(column));
memset(ans, 0, sizeof(ans));
char cmd[4];
int i, j;
while (m--)
{
scanf("%s%d%d", cmd, &i, &j);
if (cmd[0] == 'H')
row[i][j] = 1;
else if (cmd[0] == 'V')
column[j][i] = 1;
}
/*for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
printf("%d ", row[i][j]);
printf("\n");
}
printf("\n\n");
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
printf("%d ", column[i][j]);
printf("\n");
}*/
for (int i = 1; i < n; ++i)
{
for (int j = 1; j < n; ++j)
{
for (int k = 0; i + k < n&&j + k < n; ++k)
{
if (row[i][j + k] && column[i + k][j])
{
bool f1 = 1, f2 = 1;
//printf("%d %d\n", i, j);
for (int l = 0; l <= k; ++l)
{
if (column[i + l][j + k + 1] == 0)
{
f1 = 0;
break;
}
}
for (int l = 0; l <= k; ++l)
{
if (row[i + k + 1][j + l] == 0)
{
f2 = 0;
break;
}
}
if (f1&&f2)
{
++ans[k + 1];
//printf("%d %d %d\n", i, j, k + 1);
}
}
else
break;
}
}
}
bool exist = 0;
for (int i = 0; i < 10;++i)
if (ans[i]>0)
{
exist = 1;
break;
}
if (p > 0)
printf("\n**********************************\n\n");
printf("Problem #%d\n\n", ++p);
if (exist)
{
for (int i = 1; i < 10; ++i)
if (ans[i]>0)
printf("%d square (s) of size %d\n", ans[i], i);
}
else
printf("No completed squares can be found.\n");
}
//while (1);
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: