zoj1959-Quadtree II

来源:互联网 发布:淘宝二手威图手机 编辑:程序博客网 时间:2024/06/04 00:38
#include<iostream>#include<string>#include<cstring>#include<math.h>#include<stdio.h>using namespace std;const int maxsize=512;char MAP[maxsize][maxsize];int n;struct quadtree{quadtree *q[4];string value;bool operator == (quadtree temp){return temp.value==value;}quadtree(){for(int i=0;i<4;i++)q[i]=NULL;}};quadtree *DFS(int r,int c,int s)//行号列号间隔{int i;bool f=true;quadtree *temp=new quadtree;if(s==1)//最小格就赋值{temp->value='0';temp->value+=MAP[r][c];return temp;}s/=2;temp->q[0]=DFS(r,c,s);//跳格继续递归temp->q[1]=DFS(r,c+s,s);temp->q[2]=DFS(r+s,c,s);temp->q[3]=DFS(r+s,c+s,s);for(i=1;i<4;++i)//检测是否需要合并{if(!(*temp->q[0]==*temp->q[i])||temp->q[0]->value=="1")//不用合并{f=false;break;}}if(f)//需要{temp->value=temp->q[0]->value;for(i=0;i<4;++i){delete temp->q[i];temp->q[i]=NULL;//防止野指针}}elsetemp->value="1";return temp;}void preDFS(quadtree *node){if(node){if(node->value=="1")cout<<'Q';elseif(node->value=="01")cout<<'B';elsecout<<'W';for(int i=0;i<4;i++)preDFS(node->q[i]);}}void deltree(quadtree *&node)//回收内存{if(node){for(int i=0;i<4;++i){deltree(node->q[i]);} delete node;}}int main(){string str;int num;quadtree *order;char ch;cin>>str>>str>>n;cin.get(ch);cin.ignore(50,'\n');cin.ignore(50,'\n');memset(MAP,'0',sizeof(MAP));for(int i=0;i<n;i++)//c{int k=0;while(cin.get(ch)){if(ch=='\n')break;if(ch=='x'){int sum=0;scanf("%x",&num);for(int j=7;j>=0;j--){if(sum<num){sum+=pow(2.0,j);MAP[i][j+8*k]='1';}if(sum>num){sum-=pow(2.0,j);MAP[i][j+8*k]='0';}if(sum==num)break;}k++;}}}cin.clear();cout<<n<<endl;order=DFS(0,0,n);preDFS(order);cout<<endl;deltree(order);return 0;}

原创粉丝点击