#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;
}
uva 806(四叉树dfs 递归 )
最新推荐文章于 2021-03-22 09:36:52 发布