一:题目

判断一个点阵中含有几个正方形(数正方形)

如图例中:有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)的更多相关文章

  1. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  2. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

  3. 算法习题---4-10洪水(UVa815)

    一:题目 有一个n*m(<=n,m<=)的网格,每个格子都是边长为10米的正方形,网格四周是无限大的墙壁.输入每个格子的海拔高度,以及网格内雨水的总体积,输出水位的海拔高度以及有多少百分比 ...

  4. 算法习题---4-9数据挖掘(Uva1591)

    一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...

  5. tarjan算法 习题

    dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...

  6. 【算法习题】正整数数组中和为sum的任意个数的组合数

    1.递归实现(参考:https://blog.csdn.net/hit_lk/article/details/53967627) public class Test { @org.junit.Test ...

  7. 算法习题-FFT

    Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...

  8. 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)

    一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...

  9. 算法习题---5-7打印队列(UVa12100)

    一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...

随机推荐

  1. Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

    联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...

  2. Mac上使用brew安装Nginx服务器

    使用brew安装nginx $ brew install nginx 启动nginx sudo nginx 访问localhost:8080 发现已出现nginx的欢迎页面了.  为方便期间,做个软 ...

  3. Linux下卸载mysql8.x版本

    一.停止MySQL [root@localhost /]# service mysqld stop 二.查看当前安装mysql情况,查找以前是否装有mysql [root@localhost /]# ...

  4. 【安卓基础】ViewPager2的入门使用

    之前的项目中使用过ViewPager,被坑过几次.如果你在RecyclerView中的Item使用ViewPager,你绝对会产生莫名其妙的问题,因为ViewPager在同一界面上不能有两个一样的ID ...

  5. 学习了武沛齐讲的Day11-完

    DAY11 老师讲了很多,理解了一个方法   当有复杂的问题时,先拆解很小的单元(10行),测试通过了,再简化(3行) len range 感悟:其实不用计记代码(主要是记不动),,当遇到问题时:找出 ...

  6. MongoDB 4.0 事务实现解析

    MongoDB 4.0 引入的事务功能,支持多文档ACID特性,例如使用 mongo shell 进行事务操作 > s = db.getMongo().startSession() sessio ...

  7. Linux 理解Linux的memory overcommit 与 OOM Killer

    Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存.一个保守的操作系统不会允许memory overcommit,有多少就分配多少,再申请就没有了,这其实有些浪 ...

  8. 拷贝和遍历DOM树

    一.浅拷贝: 拷贝就是复制,就相当于把一个对象中的所有内容,复制一份给另一个对象,直接复制, 或者说,就是把一个对象的地址给了另外一个对象,他们的指向相同,两个对象之间有相同的属性或者方法,都可以使用 ...

  9. (6)打鸡儿教你Vue.js

    循环语句 循环使用 v-for 指令 <div id="app"> <ol> // 有序 <li v-for="item in items& ...

  10. Ansible管理上千台主机时需要的速度优化

    1 开启ssh长连接 OpenSSH 5.6版本后SSH支持了Multiplexing 设置参数 ssh_args = -C -o ControlMaster=auto -o ControlPersi ...