UVA-806 空间结构 题解答案代码 算法竞赛入门经典第二版

2023-10-26

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版

一道遍历四叉树的题目,在遍历的同时还要记住路径,做一些额外的操作。题目本身并不难。但是格式要求较多,比如输出路径时12个就换行,不能出现多余的空格、换行等等。

我的方法是在通过图构建路径时,先递归到单个像素值,再一层一层的通过父级查看各个子级的颜色是否一致,不一致则子级的路径作为输出路径,一致则继续递归到上级处理。这样同一个像素只被计算一次。

这次我遇到一个非常隐蔽的问题,就是使用了一个int变量,作为一个char类型去读取:

int k;
scanf("%c", &k);

这样使用在我本地没有问题,我使用uDebug测试,所有数据都能通过,但是去OJ提交却WA。

如果把这个换成char类型,就没问题了:

char k;
scanf("%c", &k);

我在网上搜索发现了原因:int类型作为char读取时,只会将低位作为char类型的值来读取。但是高位的值并不会处理,如果之前并没有初始化int,则高位的值是任意的,因此k的值并不等于char类型的值。所以,如果我们初始化了int,这样使用就没问题了:

int k = 0;
scanf("%c", &k);

如果不是完全了解其中的细节,最好还是按照官方类型使用,否则会像这样出现一些隐藏的问题。AC代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

bool graphs[70][70];
int paths[4100];
int n, pathNum;

void inGraphs() {
	while(getchar() != '\n') ;
	int i, j, k;
	for(i = 0; i < n; ++i) {
		for(j = 0; j < n; ++j) {
			k = 0;
			scanf("%c", &k);
			if(k == '1') graphs[i][j] = true;
			if(k == '0') graphs[i][j] = false;
		}
		while(getchar() != '\n') ;
	}
}

void handleOnePath(int k) {
	int unit, begx = 0, endx = n, begy = 0, endy = n, ni = n;
	int i, j;
	while(k > 0) {
		unit = k % 5;
		k = k / 5;
		ni = ni / 2;
		switch(unit) {
			case 1:
				endx = begx + ni;
				endy = begy + ni;
				break;
			case 2:
				endx = begx + ni;
				begy = begy + ni;
				break;
			case 3:
				begx = begx + ni;
				endy = begy + ni;
				break;
			case 4:
				begx = begx + ni;
				begy = begy + ni;
				break;
		}
	}
	for(i = begx; i < endx; ++i) {
		for(j = begy; j < endy; ++j) {
			graphs[i][j] = true;
		}
	}
}

void inPaths() {
	int k, i, j;
	while(scanf("%d", &k) && k != -1) {
		if(k == 0) {
			for(i = 0; i < n; ++i) {
				for(j = 0; j < n; ++j) {
					graphs[i][j] = true;
				}
			}
		}
		handleOnePath(k);
	}
}

void outGraphs() {
	int i, j;
	for(i = 0; i < n; ++i) {
		for(j = 0; j < n; ++j) printf("%c", graphs[i][j] == true ? '*' : '.');
		putchar('\n');
	}
}

int handlePaths(int begx, int begy, int unit, int base, int basei) {
	if(unit == 1) {
		if(graphs[begx][begy] == false) return 0; 
		else return 1;
	}
	int cell[4];
	unit = unit / 2;
	cell[0] = handlePaths(begx, 		begy, 			unit, base + basei * 1, basei*5);
	cell[1] = handlePaths(begx, 		begy + unit, 	unit, base + basei * 2, basei*5);
	cell[2] = handlePaths(begx + unit, 	begy, 			unit, base + basei * 3, basei*5);
	cell[3] = handlePaths(begx + unit, 	begy + unit, 	unit, base + basei * 4, basei*5);
	if(cell[0] == 0 && cell[1] == 0 && cell[2] == 0 && cell[3] == 0) return 0;
	if(cell[0] == 1 && cell[1] == 1 && cell[2] == 1 && cell[3] == 1) return 1;
	for(int i = 0; i < 4; ++i) {
		if(cell[i] == 1) paths[pathNum++] = base + basei * (i+1); 
	}
	return 2;
}

void outPaths() {
	int i, j = 0;
	for(i = 0; i < pathNum; ++i) {
		if(j != 0 && j != 12) putchar(' ');
		if(j == 12) {
			putchar('\n');
			j = 0;
		}
		printf("%d", paths[i]);
		++j;
	}
	if(pathNum) putchar('\n');
	printf("Total number of black nodes = %d\n", pathNum);
}

int comp(const void * ltr, const void* rtr) {
	int l = *(const int *)ltr;
	int r = *(const int *)rtr;
	if(l < r) return -1;
	if(l == r) return 0;
	return 1;
}

int main() {
	int t = 0, res;
	while(scanf("%d", &n) && n != 0) {
		if(t) printf("\n");
		printf("Image %d\n", ++t); 
		memset(graphs, 0, sizeof(graphs));
		memset(paths, 0, sizeof(paths));
		pathNum = 0;
		if(n > 0) {
			inGraphs();
			res = handlePaths(0, 0, n, 0, 1);
			if(res == 1) paths[pathNum++] = 0;
			qsort(paths, pathNum, sizeof(int), comp);
			outPaths();
		} else {
			n = -n;
			inPaths();
			outGraphs();
		}
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UVA-806 空间结构 题解答案代码 算法竞赛入门经典第二版 的相关文章

随机推荐

  • VUE3+Element-Plus form表单封装

    VUE3 Element Plus form表单封装 新建form组件页面 创建index vue 新建form组件页面 在components中创建新组件 将需要的form表单中常用的UI组件引入 vue3创建组件和vue2中多少有点区别
  • 大学《数据库原理与技术》复习题(二)

    数据库复习题 一 选择题 1 B 是按照一定的数据模型组织的 长期存储在计算机内 可为多个用户共享的数据的集合 A 数据库系统 B 数据库 C 关系数据库 D 数据库管理系统 2 数据库系统的基础是 A 数据结构 B 数据库管理系统 C 操
  • LVGL V8

    本文适用于LVGL V8版本 LVGL simulator vs2019 官方工程 lv sim visual studio 使用注意事项 1 将官方工程从github上下载下来 最好使用git 将整个工程clone下来 因为工程内部有依赖
  • c++坑人

    大家好 我是LCR 今天为大家带来的是c 中的弹窗病毒 当然你也可以把它理解为坑人代码 如果喜欢这篇文章 可以给我点一个赞吗 代码解释 system是c语言库里面自带的一个函数 start的原本意思为 跳转 后面本应接网址 当你的后面为空时
  • 多功能翻译工具:全球翻译、润色和摘要生成

    openai translator openai translator Stars 18 1k License AGPL 3 0 这个项目是一个多功能翻译工具 由 OpenAI 提供支持 可以进行全球单词翻译 单词润色和摘要生成等操作 提供
  • python项目导出依赖包requirements.txt文件

    只导出当前项目依赖包 注意 使用 pip freeze gt requirements txt 会导出大量无用的文件 包括很多个包信息 其实这里是把你当前 python 环境的所有包的相关信息导出来了 如果我们只需导出当前项目所需的依赖包
  • 如何创建线程,多线程下又如何上锁保护公共资源?

    目录 一 创建线程几种方法 1 继承thread类 重写run方法 2 实现runnable接口 重写run方法 3 使用匿名类 或 lamda表达式 让代码更简洁 4 Callable 接口 5 使用线程池创建线程 二 多线程下 需要上锁
  • canvas画布合成

  • windows自动颁发证书

    首先去配置组策略 计算机配置 windows设置 安全设置 公钥策略 证书注册策略和证书服务客户端 不需要勾选禁用用户配置注册策略服务器 用户配置也这样配置 最后进入证书管理器 找到证书模板 右键证书管理 看见一个计算机 去右键 安全这里允
  • 虚拟内存笔记

    虚拟内存 为什么要有虚拟内存 有些进程实际需要的内存很大 超过物理内存的容量 比如一个几十G的游戏 要运行在内存为8G的计算机上 由于多道程序设计 主存是同时可以存放多个进程的逻辑及数据的 这就使得每个进程可用的物理内存更加稀缺 不可能无限
  • [1194]GitLab在web端合并分支

    文章目录 gitlab 在 web 端合并分支 1 1 发起合并操作 1 2 选择源分支和目标分支 1 3 输入合并备注 1 4 合并检查 1 5 完成合并 1 6 查看提交记录 修改的文件及内容 gitlab 在 web 端合并分支 1
  • 概率密度估计(Probability Density Estimation)--Part3:混合模型

    目录 引入 求解方法 MLE法 Clustering E M EM EM算法 大概的说明 较为详细的说明 高斯混合中的
  • 线性代数 --- Gram-Schmidt, 格拉姆-施密特正交化(上)

    Gram Schmidt正交化 在前面的几个最小二乘的文章中 实际上已经看到Gram Schmidt正交化的影子 在我个人看来 Gram Schmidt正交化更像是一种最小二乘的简化算法 下面 我会接着上一篇文章中的最后一个例子讲 慢慢引出
  • 【HDLBits 刷题 10】Circuits(6)Finite State Manchines 10-17

    目录 写在前面 Finite State Manchines Lemmings1 Lemmings2 Lemmings3 Lemmings4 Fsm onehot Fsm ps2 Fsm ps2data Fsm serial 写在前面 HD
  • LeetCode922. 按奇偶排序数组 II

    LeetCode922 按奇偶排序数组 II 给定一个非负整数数组 A A 中一半整数是奇数 一半整数是偶数 对数组进行排序 以便当 A i 为奇数时 i 也是奇数 当 A i 为偶数时 i 也是偶数 你可以返回任何满足上述条件的数组作为答
  • protobuf 中数据编码规则

    背景 protobuf 是一种跨平台的序列化结构数据的方法 可用于网络数据传输及存储 protobuf 在生成的 C 代码中为 proto 文件中的每个 message 生成了对应的 C 类 并提供了数据成员的读写方法 本文对 protob
  • 以太网知识-GMII / RGMII接口

    今天和海翎光电的小编一起分析MII RMII SMII 以及GMII RGMII SGMII接口的信号定义 及相关知识 同时小编也对RJ 45接口进行了总结 分析了在10 100模式下和1000M模式下的连接方法 GMII 接口分析 GMI
  • 避免跨域的CDN部署方案

    我们的一个项目采用动静分离的部署方式 服务接口在自己的服务器上 静态资源保存在OSS 通过CDN访问 不过这样有时会有跨域问题 本文总结解决的办法 原来的做法 原本的做法 服务接口部署在自己的服务器上 通过域名api xxx com访问 不
  • 添加序号_Excel——合并单元格添加序号

    点击上方关注我们获取更多 在工作中 为了数据便于查看 经常需要将内容相同的单元格进行合并 在进行了批量合并单元格后 如何给合并单元格添加序号成为又一难点 今天就来和大家分享一下在EXCEL中如何给合并单元格添加序号 以下表数据 城市销售数据
  • UVA-806 空间结构 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 一道遍历四叉树的题目 在遍历的同时还要记住路径 做一些额外的操作 题目本身并不难 但是格式要求较多 比如输出路径时12个就换行 不