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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章