uva 806(四叉树dfs 递归 )
程序员文章站
2022-06-03 21:09:57
...
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
vector<int>vec;
char l[70][70];
int dfs(int x,int y,int len,int sum,int cnt)
{
bool flag = true,flag1 = true;
for(int i = x ; i < x + len ; i++){
for(int j = y ; j < y + len ; j++){
if(l[i][j] == '1') flag = false;
else flag1 = false;
}
}
//如果只有一种颜色
if(flag || flag1) return flag1 ? sum : 0;
int t;
if((t = dfs(x, y, len/2, sum+1*cnt, cnt*5)) && t) vec.push_back(t);
if((t = dfs(x, y+len/2, len/2, sum+2*cnt, cnt*5)) && t) vec.push_back(t);
if((t = dfs(x+len/2, y, len/2, sum+3*cnt, cnt*5)) && t) vec.push_back(t);
if((t = dfs(x+len/2, y+len/2, len/2, sum+4*cnt, cnt*5)) && t) vec.push_back(t);
return 0;
}
void change(int x,int y,int len)
{
for(int i = x ; i < x + len ; i++){
for(int j = y ; j < y + len ; j++){
l[i][j] = '*';
}
}
}
int main()
{
int n,t = 1;
while(cin >> n && n){
if(t > 1) printf("\n");
vec.clear();
memset(l,0,sizeof l);
if(n > 0){
getchar();
for(int i = 0 ; i < n ; i++)
scanf("%s",l[i]);
bool flag = false;
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++)
if(l[i][j] == '0'){
flag = true;
break;
}
if(flag) dfs(0,0,n,0,1);
else vec.push_back(0);
sort(vec.begin(),vec.end());
int k = vec.size();
printf("Image %d\n",t++);
for(int i=0;i<vec.size();){
printf("%d",vec[i++]);
if(i%12==0||i==(int)vec.size()) printf("\n");
else printf(" ");
}
printf("Total number of black nodes = %d\n",k);
}
else{
n = -n;
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++)
l[i][j] = '.';
int k;
while(cin >> k && k != -1){
int x = 0,y = 0,len = n;
while(k){
int a = k % 5;
switch(a){
case 1:len /= 2;break;
case 2:y += len/2;len /= 2;break;
case 3:x += len/2;len /= 2;break;
case 4:x += len/2;y += len/2; len /= 2;
}
k /= 5;
}
change(x,y,len);
}
printf("Image %d\n",t++);
for(int i = 0 ; i <n ; i++)
printf("%s\n",l[i]);
}
}
return 0;
}
推荐阅读
-
Java二叉树的四种遍历(递归与非递归)
-
二叉树的创建与四种遍历之递归版本
-
二叉树的创建与四种遍历之递归版本
-
Java二叉树的四种遍历(递归和非递归)
-
非二叉树 UVA297 四分树 Quadtrees
-
Tree UVA - 548 (DFS+建立二叉树)
-
【代码超详解】UVA 548 Tree 树(二叉树、DFS)
-
数据结构-树与二叉树-二叉树的递归遍历(Tree UVA - 548||Not so Mobile UVA - 839||The Falling Leaves UVA - 699)
-
【数据结构】-------二叉树的四种遍历方法(递归实现)
-
uva 806(四叉树dfs 递归 )