zoj 1788 Quad Trees
先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归
四分树建立完后,再进行一深度优先遍历,生成二进制字符串,再转化为16进制输出
//#include "stdafx.h"
#include <string.h>
#include <string>
#include <queue>
#include <iostream>
#include "stdio.h"
using namespace std;
char MAP[512][512];
class quadtree//结点
{
public:
char value[3];// "00"->all 0 ,"01"->all 1,"1"->mixed
quadtree*q[4];//four children
quadtree()
{
q[0] = q[1] = q[2] = q[3] = 0;//initialize four children
}
bool operator == (const quadtree &p)const//运算符重载,
{
if (strcmp(value, "1") == 0 || strcmp(value, p.value) != 0)
return 0;
else
return 1;
} };
quadtree * DFS(int r, int c, int s)//r ,c 坐标,s长度
{
int i; bool f = 1;
quadtree*temp = new quadtree;
if (s==1)//最小长度,每一个格
{
temp->value[0] = '0';
temp->value[1] = MAP[r][c];
temp->value[2] = 0;//串结束符号?
return temp; }
s /= 2;//四分
temp->q[0] = DFS(r, c, s);
temp->q[1] = DFS(r, c + s, s);
temp->q[2] = DFS(r + s, c, s);
temp->q[3] = DFS(r + s, c + s, s);
for (i = 1; i < 4;i++)
{
if(!(*temp->q[0] == *temp->q[i]))//some of four children are different ,can not be merged
{
f = 0;
break;
}
}
if (f)//all children are same,merge
{
strcpy(temp->value, temp->q[0]->value);
for (i = 0; i < 4; i++)
{
delete temp->q[i]; temp->q[i] = 0;//delete all children
}
}
else// don't merge
{
strcpy(temp->value, "1");
}
return temp;
}
string BFS(quadtree*root)//广度遍历,生成二进制字符串
{
string s = "";
quadtree *cur = root;
queue <quadtree*> que;
que.push(root);
while (!que.empty())
{
cur = que.front();
que.pop();
s += cur->value;
for (int i = 0; i < 4; i++)
{
if (cur->q[i]->value != NULL)//有子才放进去!!!!!!!
que.push(cur->q[i]);
}
}
return s;
}
//////////////////////////////////////////////
//转化为16进制。。别人家的代码
char tohex(const string& str)
{
int ret = 0; for (int i = 0; i < 4; i++)
{
ret <<= 1;//左移 实现16进制的转化
if (str[i] == '1')
++ret;
} return (ret < 10) ? '0' + ret : 'A' + ret - 10;
}
string ToHex(const string& str)
{
string tmp = str;
string ret = ""; while (tmp.length() % 4 != 0)
tmp = "0" + tmp;
for (size_t i = 0; i < tmp.length(); i += 4)
ret += tohex(tmp.substr(i, 4));//substr 截取指定字符串,i为起始位置,4表示长度 return ret;
}
////这部分是别人家的 = =
///////////////////////////////////////////////////
int main()
{
string al;
int k, N;
scanf("%d", &k);//输入test 次数
while (k--)
{
scanf("%d", &N);
for (int i = 0; i < N; i++)//输入矩阵大小
{
for (int j = 0; j < N; j++)
{
cin >> MAP[i][j];// scanf("%c", &MAP[i][j]);//initialize the array } }
quadtree *root;
root =DFS(0, 0, N);//build a quardtree;
al = BFS(root);
//cout << al << endl;
cout << ToHex(al) << endl;
}
return 0;
}
zoj 1788 Quad Trees的更多相关文章
- [LeetCode] Quad Tree Intersection 四叉树相交
A quadtree is a tree data in which each internal node has exactly four children: topLeft, topRight, ...
- [LeetCode] Construct Quad Tree 建立四叉树
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- LeetCode 427 Construct Quad Tree 解题报告
题目要求 We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be tru ...
- [LeetCode&Python] Problem 427. Construct Quad Tree
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- leetcode 427. Construct Quad Tree
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- 【LeetCode】558. Quad Tree Intersection 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】427. Construct Quad Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- “等一下,我碰!”——常见的2D碰撞检测
转自:https://aotu.io/notes/2017/02/16/2d-collision-detection/ 在 2D 环境下,常见的碰撞检测方法如下: 外接图形判别法 轴对称包围盒(Axi ...
- elasticsearch 口水篇(6) Mapping 定义索引
前面我们感觉ES就想是一个nosql数据库,支持Free Schema. 接触过Lucene.solr的同学这时可能会思考一个问题——怎么定义document中的field?store.index.a ...
随机推荐
- js 控制Div循环显示 非插件版
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- QT 网络编程
#include "networkinformation.h" #include "ui_networkinformation.h" networkinform ...
- Redmine开发帮助
这里先零星记录二次开发用得上的知识点: 1.windows下开发环境,参考此文.最好使用rubyinstaller安装,注意选择版本.或者直接安装railsinstaller. 2.获取自定义内容,参 ...
- Bash:-set设置位置变量结合while和shift使用
#!/bin/bash aaa=( ) bbb=(a b c d) set -- ${aaa[@]} ));do } shift done set -- echo "------------ ...
- 关于访问链接返回XML的获取数据
1. 返回DataSet格式; /// <summary> /// 向某个url提交数据并读取该地址返回的xml,并将xml转换成dataset,并返回dataset中某个表 /// &l ...
- java中的23中设计模式(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- easyui DataGrid 工具类之 WorkbookUtil class
/** * @Title: WorkbookUtil.java * @Description: excel工具类 * @date 2014年5月29日 上午10:36:42 * @version V1 ...
- 动画黄金搭档:CADisplayLink & CAShapeLayer
我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...
- Fisher–Yates shuffle 洗牌(shuffle)算法
今天在敲undersore的源码,数组里面有一个shuffle,把数组随机打乱. _.shuffle = function(obj) { var set = isArrayLike(obj) ? ob ...
- API Monitor v2.0 Alpha-r13 (32+64) 汉化版
API Monitor v2.0 Alpha-r13 (32+64) 汉化版: 链接: https://pan.baidu.com/s/1jIx5znC 密码: 4538 本软件已最大化汉化,已经趋于 ...