UVA-806 Spatial Structures 空间结构

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;
}

猜你喜欢

转载自blog.csdn.net/lky_ac/article/details/83993238