297UVa四分树

来源:互联网 发布:视频会议录像软件 编辑:程序博客网 时间:2024/06/06 05:11

一次AC大笑,但写得很复杂

主要搞清楚,什么时候要递归调用(读到'p’),什么时候要返回上一层(产生了4个节点后)

#include<stdio.h>#include<string.h>char first[2000];char sec[2000];char ans[2000];void eat(char*& str);void build(char*& first, char*& sec,char*& ans);void tree(char*& first, char*& sec,char*& ans);int sum(char*& s,int n);int count(char*& s,int n);int main(){//freopen("input.txt","r",stdin);int numcase;scanf("%d", &numcase);for(int i = 0; i < numcase; i++){scanf("%s",first);scanf("%s",sec);memset(ans, 0, sizeof(ans) );char* f = first;char* s = sec;char* a =ans;build(f,s,a);*a = '\0';//printf("%s\n",ans);a = ans;printf("There are %d black pixels.\n", sum(a,1024));}}int sum(char*& s,int n){switch(*s){case 'e':return 0;case 'f':return 1024;case 'p':return count(++s,n/4);}}int count(char*& s,int n){int sum = 0;for(int i = 0; i < 4;i++){switch(*s){case 'e':sum+=0;s++;break;case 'f':sum+=n;s++;break;case 'p':sum+=count(++s,n/4);break;}}return sum;}void build(char*& first, char*& sec,char*& ans){char* pt = 0;if(*first == *sec){*ans = *first;if(*ans == 'p')tree(++first,++sec,++ans);}else if(*first=='f'&&*sec=='e'){*ans++ = *first++;sec++;}else if(*first=='e'&&*sec=='f'){*ans++ = *sec++;first++;}else if(*first=='p'&&*sec=='e'){sec++;*ans++ = *first++;tree(first,pt,ans);}else if(*first=='e'&&*sec=='p'){first++;*ans++ = *sec++;tree(pt,sec,ans);}else if(*first=='p'&&*sec=='f'){//eat(++first);*ans++ = *sec++;}else if(*first=='f'&&*sec=='p'){//eat(++sec);*ans++ = *first++;}}void tree(char*& first, char*& sec,char*& ans){char* pt = 0;for(int i = 0; i < 4;i++){if(!first){*ans = *sec;if(*ans == 'p')tree(first,++sec,++ans);else{ans++;sec++;}}else if(!sec){*ans = *first;if(*ans == 'p')tree(++first,sec,++ans);else{ans++;first++;}}else if(*first == *sec){*ans = *first;if(*ans == 'p')tree(++first,++sec,++ans);else{ans++;first++;sec++;}}else if(*first=='f'&&*sec=='e'){*ans++ = *first++;sec++;}else if(*first=='e'&&*sec=='f'){*ans++ = *sec++;first++;}else if(*first=='p'&&*sec=='e'){sec++;*ans++ = *first++;tree(first,pt,ans);}else if(*first=='e'&&*sec=='p'){first++;*ans++ = *sec++;tree(pt,sec,ans);}else if(*first=='p'&&*sec=='f'){eat(++first);*ans++ = *sec++;}else if(*first=='f'&&*sec=='p'){eat(++sec);*ans++ = *first++;}}}void eat(char*& str){for(int i = 0; i < 4;i++){if(*str !='p')str++;elseeat(++str);}}


这个不用建树的:

http://blog.csdn.net/zyq522376829/article/details/46516621


0 0