我是靠谱客的博主 等待啤酒,最近开发中收集的这篇文章主要介绍UVA297 思路+代码 还是递归~,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接

题目大意:
可以用一棵四分树来表示一副黑白像素,用根节点表示整幅图像,然后把行和列二等分,按照如下图中顺序编号为1—4,分别对应了四分数根节点从左往右的四个子节点,如果某子节点对应的区域为全黑或全白,则直接用一个黑节点或者白节点表示,如果既有黑节点又有白节点,那么就用一个灰节点表示,并且为这个区域递归建树。

在这里插入图片描述
输入两颗四分树的先序遍历序列,求二者合并(黑色部分合并)后的黑像素的个数,用p表示灰节点,f表示黑色,e表示白色,四分树的高度不超过5。

注: 默认图像的大小为 32 × 32 32×32 32×32

解题思路:

递归:可以直接用一个二维数组表示一幅画板,然后将两颗四分树画在同一幅画板上, 最后计数整个画板上的黑色素的个数即可。

#include <iostream>
#include <cstring>
using namespace std;

const int Len = 32;
const int maxn = 4 << 6;

char s[maxn];
int board[Len][Len];	// 画板
int cnt;

void draw(const char *s,int &p,int r,int c,int w)	// 模拟画图
{		// 从画板 (r,c)开始画一个边长为w的图
	char tmp = s[p++];
	if(tmp=='p') {
		draw(s,p,r,c+w/2,w/2);	//区域1
		draw(s,p,r,c,w/2);		//区域2
		draw(s,p,r+w/2,c,w/2);	//区域3
		draw(s,p,r+w/2,c+w/2,w/2);	//区域4
	} else if(tmp=='f') {	// 画黑色像素格
		for(int i = r; i < r+w; ++i) 
			for(int j = c; j < c+w;++j) {
				if(!board[i][j]) {
					board[i][j] = 1;
					cnt++;	
				}
			}
	}
}
int main()
{
	int n;
	while(n--) {
		memset(0,board,sizeof(board));
		cnt = 0;
		for(int i = 0; i < 2; ++i) {
			cin >> s;
			int p = 0;
			draw(s,p,0,0,Len);
		}
		cout << "There are " << cnt << "black pixels.n";
	}
}

最后

以上就是等待啤酒为你收集整理的UVA297 思路+代码 还是递归~的全部内容,希望文章能够帮你解决UVA297 思路+代码 还是递归~所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部