题目:
输入可能给你两种数据,先输入一个长度,长度为输入数的绝对值
- 如果数为负给出四分数有多少黑色节点,注意黑色节点下不再有分支,每个黑色节点的值为从四分树的顶部走到该节点走过路径的数字排好的五进制转十进制数,例如 若一个黑色节点由四分树的顶部先走 NW 再走 NE 那么值就为 21(越顶部的数字在越后面) (NW ,NE, SW, SE 分别表示1,2,3,4)对应的十进制就为 11。给出的黑色节点的值初始为10进制,要转成5进制,然后得到图的0和1,然后绘画出来
- 如果为正数,那就是给出一副图,然后退出所有的黑色节点的十进制然后写出来,本题输出格式挺多坑,建议uDebug后在提交。
要点:
- 注意一下格式即可,模拟题。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 64;
char pic[maxn][maxn];
vector<int> ans;
int kase = 0;
string tenToFive(int x) {
string ret;
while (x) {
ret += x % 5 + '0';
x /= 5;
}
return ret; //倒着的
}
void transformToPic(int n) {
cout << "Image " << ++kase << endl;
memset(pic, '.', sizeof(pic));
vector<int> data;
int x;
while (cin >> x && x != -1)
data.push_back(x);
for (auto& num : data) {
string s = tenToFive(num);
int left, top, width;
left = top = 0;
width = n;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '2' || s[i] == '4') top += width / 2;
if (s[i] == '3' || s[i] == '4') left += width / 2;
width /= 2;
}
for (int i = left; i < left + width; i++)
for (int j = top; j < top + width; j++)
pic[i][j] = '*';
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << pic[i][j];
cout << endl;
}
}
int fiveToTen(string dir) {
int ret = 0;
int len = dir.size();
for (int i = 0; i < len; i++)
ret += (dir[i] - '0') * pow(5, i);
return ret;
}
void dfs(int left, int top, int width, string dir) {
bool Bflag = true; //全黑
bool Wflag = true; //全白
for (int i = left; i < width + left; i++) {
for (int j = top; j < width + top; j++) {
if (pic[i][j] == '0') Bflag = false;
if (pic[i][j] == '1') Wflag = false;
if (!Wflag && !Bflag) break;
}
}
if (Bflag)
ans.push_back(fiveToTen(dir));
if (Wflag || Bflag) return;
dfs(left, top, width / 2, dir + "1");
dfs(left, top + width / 2, width / 2, dir + "2");
dfs(left + width / 2, top, width / 2, dir + "3");
dfs(left + width / 2, top + width / 2, width / 2, dir + "4");
}
void transformToNode(int n) {
ans.clear();
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> pic[i][j];
dfs(0, 0, n, "");
sort(ans.begin(), ans.end());
cout << "Image " << ++kase;
int size = ans.size();
for (int i = 0; i < size; i++) {
if (i % 12 == 0) cout << endl << ans[i];
else cout << " " << ans[i];
}
cout << endl;
cout << "Total number of black nodes = " << size << endl;
}
int main() {
int n;
while (cin >> n && n) {
if (kase) cout << endl;
if (n < 0) transformToPic(-n);
else transformToNode(n);
}
return 0;
}

该博客主要探讨了UVa 806编程问题,涉及四分树的空间结构。当输入为负数时,需要计算并输出黑色节点的数量及其在四分树中的五进制表示。黑色节点的值是根据路径计算的十进制数,转换为五进制后用于构建图形。而正数输入则要求根据给定图形找出所有黑色节点的十进制表示。博主提醒注意输出格式,这是一道需要仔细模拟的题目。
&spm=1001.2101.3001.5002&articleId=100101368&d=1&t=3&u=c292993ebad14d3c8b49e3bd071eecd8)
286

被折叠的 条评论
为什么被折叠?



