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