UVA-806 Spatial Structures 空间结构
题目链接
题目要求将给定的点阵图转为路径,将给定的路径转化为点阵,所以分两步解题。分别进行递归就能求解。具体细节见代码注释。
另外需要特别注意输出格式,三次presontation error的教训。而且以后要注意边界数据的测试。
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
char graph[70][70];
int que[64*64];
int CNT=0;
//cheek()用于检验(x1,x1)到(x2,y2)为对角线的矩形中是否全为'0'或'1'。
bool cheek(int x1,int y1,int x2,int y2,char a){
for(int i=x1;i<x2;i++){
for(int j=y1;j<y2;j++){
if(graph[i][j]!=a) return false;
}
}
return true;
}
//trans()将数字转码
int trans(int num,int n,int m){
int ans=0,cnt=1;
while(num>0){
ans+=(num%n)*cnt;
cnt*=m;
num/=n;
}
return ans;
}
//divide() 递归分解点阵图,其中ans为当前区域的五进制码
void divide(int x1,int y1,int x2,int y2,int n,int ans,int deep){
if(cheek(x1,y1,x2,y2,'1')){ //如果全为'1',将ans转为十进制并记录
que[CNT++]=trans(ans,10,5);
return;
}
if(cheek(x1,y1,x2,y2,'0')) return; //全为'0'则中断此项递归
int cnt=1;
//以(x1,y1)为左顶点 将区域分为田字形区域,对四个区域递归求解,ans为五进制码。
for(int i=x1,j=x2-n/2;i<=x1+n/2;i+=n/2,j+=n/2){
for(int k=y1,z=y2-n/2;k<=y1+n/2;k+=n/2,z+=n/2){
divide(i,k,j,z,n/2,ans+cnt*deep,deep*10);
cnt++;
}
}
}
//build() 将已经转化为五进制的路径码进行递归构图
void build(int num,int n,int x1,int y1,int x2,int y2){
if(num==0){ //如果num为零了,终止此项递归,开始构图。
for(int i=x1;i<x2;i++){
for(int j=y1;j<y2;j++){
graph[i][j]='*';
}
}
return;
}
//分别对以(x1,y1)为左顶点的田字形区域的四个小部分递归构图
if(num%10==1) build(num/10,n/2,x1,y1,x2-n/2,y2-n/2);
else if(num%10==2) build(num/10,n/2,x1,y1+n/2,x2-n/2,y2);
else if(num%10==3) build(num/10,n/2,x1+n/2,y1,x2,y2-n/2);
else if(num%10==4) build(num/10,n/2,x1+n/2,y1+n/2,x2,y2);
}
int main(){
int n,kase=0;
while(scanf("%d",&n)&&n!=0){
if(kase) printf("\n");
printf("Image %d\n",++kase);
CNT=0;
memset(que,0,sizeof(que));
if(n>0){
memset(graph,0,sizeof(graph));
for(int i=0;i<n;i++) scanf("%s",graph[i]);
divide(0,0,n,n,n,0,1);
sort(que,que+CNT); //对答案排序后输出
for(int i=0;i<CNT;i++){
printf("%d",que[i]); //特别注意此处的格式处理
if((i+1)%12==0||i+1==CNT) printf("\n");
else printf(" ");
}
printf("Total number of black nodes = %d\n",CNT);
}
else{
memset(graph,'.',sizeof(graph));
n*=-1;
int num,m=0;
while(scanf("%d",&num)){
if(num==-1) break;
build(trans(num,5,10),n,0,0,n,n);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%c",graph[i][j]);
}
printf("\n");
}
}
}
return 0;
}