算法习题---4-2正方形(UVa201)
一:题目
判断一个点阵中含有几个正方形(数正方形)

如图例中:有2个边长为1的正方形,1个边长为2的正方形
(一)题目详解

(二)样例输入
4 表示每行每列各有4个顶点
16 表示整个点阵中共有16条边
H 1 H表示水平边 从(1,1)->(1,2)之间有一条边 注意:1 1 表示水平第一行第一个顶点
H
H
H
H
H
H
H
V 1 V表示垂直边 从(1,1)->(2,1)之间有一条边 注意:1 1 表示垂直看第一列第一个顶点
V
V
V
V
V
V
V

H
H
V

二:代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define N 9
int n,m;
int edge[N*N][]; //边信息
int square[N+][N+]; //正方形顶点信息,从(1,1)开始
获取边信息edge,并转换为一个二维数组square保存顶点信息《重点》
void getInfo()
{
//获取顶点、边数
scanf("%d", &n);
scanf("%d", &m); //将边信息转换为正方形信息
memset(square, sizeof(square), ); //获取边信息
for (int i = ; i < m; i++)
{
getchar();
scanf("%c %d %d", (char*)&edge[i][], &edge[i][], &edge[i][]);
//注意1表示水平有边,2表示垂直有边,既有水平,又有垂直为3
//注意V的时候 V 2 1 是代表第二列第一个
edge[i][] == 'H' ? square[edge[i][]][edge[i][]] += : square[edge[i][]][edge[i][]] += ;
}
}
获取指定边数的正方形个数
int getNumForSq(int ec)
{
//从正方形左上角开始从上到下,从左到右
int num = ,x,y;
for (int i = ; i <= n - ec;i++) //列
{
for (int j = ; j <= n - ec;j++) //行
{
if (square[j][i]!=) //此处有顶点
{
//开始判断是否有指定大小正方形
x = j, y = i;
//判断上横边
for (y = i; y <= i + ec-; y++)
if (!(square[x][y] == || square[x][y] == ))
goto Next; //判断下横边 x = j + ec, y = i;
for (y = i; y <= i + ec-; y++)
if (!(square[x][y] == || square[x][y] == ))
goto Next; //判断左边
x = j, y = i;
for (x = j; x <= j + ec-;x++)
if (!(square[x][y] == || square[x][y] == ))
goto Next; //判断右边
x = j, y = i + ec;
for (x = j; x <= j + ec-; x++)
if (!(square[x][y] == || square[x][y] == ))
goto Next; //构成正方形
num++;
} Next:;
}
} return num;
}
主函数
int main()
{
FILE* fp=freopen("data2.in", "r", stdin);
freopen("data2.out", "w", stdout);
int i = , j,num,flag; while (!feof(fp))
{
//获取一组信息
flag = ;
getInfo();
printf("Problem #%d\n\n", i++); //开始进行计算正方形大小 从1->n-1
for (j = ; j < n;j++)
{
num = getNumForSq(j);
if (num)
{
printf("%d square(s) of size %d\n", num, j);
flag = ;
}
} flag ? printf("\n**************************\n\n") : printf("No completed squares can be found.\n");
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout); return ;
}
结果输出

算法习题---4-2正方形(UVa201)的更多相关文章
- 【算法习题】数组中任意2个(3个)数的和为sum的组合
题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...
- July 算法习题 - 字符串4(全排列和全组合)
https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...
- 算法习题---4-10洪水(UVa815)
一:题目 有一个n*m(<=n,m<=)的网格,每个格子都是边长为10米的正方形,网格四周是无限大的墙壁.输入每个格子的海拔高度,以及网格内雨水的总体积,输出水位的海拔高度以及有多少百分比 ...
- 算法习题---4-9数据挖掘(Uva1591)
一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...
- tarjan算法 习题
dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...
- 【算法习题】正整数数组中和为sum的任意个数的组合数
1.递归实现(参考:https://blog.csdn.net/hit_lk/article/details/53967627) public class Test { @org.junit.Test ...
- 算法习题-FFT
Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...
- 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)
一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...
- 算法习题---5-7打印队列(UVa12100)
一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...
随机推荐
- 利用os模块求一个文件夹的大小。
一.递归方法 def size(path): #给定一个初始的文件夹路径 num = 0 list_name = os.listdir(path) #利用os模块方法,以列表的形式获得该文件夹下面的所 ...
- django Error: HINT: Add or change a related_name argument to the definition for 'UserProfile.groups' or 'User.groups'.
# 解决方案: 因自己重新封装user为UserProfile故在 settings中 添加自己的
- python定义函数时的参数&调用函数时的传参
一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...
- 定时器 延时调用setTimeout
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- docker学习(六) Docker命令查询
Docker命令查询 1.基本语法docker [OPTIONS] COMMAND [arg...]一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器.可以通 ...
- 使用selenium 多线程爬取爱奇艺电影信息
使用selenium 多线程爬取爱奇艺电影信息 转载请注明出处. 爬取目标:每个电影的评分.名称.时长.主演.和类型 爬取思路: 源文件:(有注释) from selenium import webd ...
- 【Winfrom-无边框窗体】Winform如何拖动无边框窗体?
去掉边框 this.FormBorderStyle = FormBorderStyle.None; 方法一: Point mouseOff;//鼠标移动位置变量 bool leftFlag;//标签是 ...
- java线程中yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- MongoDB CRUD 操作
crud是指在做计算处理时的增加(Create).读取查询(Retrieve).更新(Update)和删除(Delete)几个单词的首字母简写.crud主要被用在描述软件系统中数据库或者持久层的基本操 ...
- soap1.1与soap1.2
1.soap1.2 如果加上jar包后,项目启动报错,有可能是jar包没起作用, 解决方法:把jar包移除,重新加入jar包 TCP/IP Monitor监测到的内容: soap1.2请求与soap1 ...
