nyoj 1278 Prototypes analyze

来源:互联网 发布:linux设置javahome 编辑:程序博客网 时间:2024/05/22 14:28


点击打开链接


题意:  让你建n个排序二叉树。 问你结构不同的树有多少。


题解: 建树,暴力比较树,

   其实我开始想先全部建树,然后把所有数先序遍历一遍,记录遍历的左右子节点的顺序,存字符串中,用map计数。

   后来这个都很快, 学习了,树学的好差劲呀。


#include<cstdio>#include<queue>#include<string>#include<vector>#include<cstring>#include<map>#include<cmath>#include<algorithm>#define ll long longusing namespace std;const int maxn=10020;const int inf=0;int n,m,ff;typedef struct node{    node *left;    node *right;    int val;}*Tree;Tree tree[55];void builetree(Tree &p,int val){    if(p==NULL){        p=new node();        p->left=NULL;        p->right=NULL;        p->val=val;    }    if(val>p->val) builetree(p->right,val);    if(val<p->val) builetree(p->left,val);}void dfs(Tree p){    if(p->left) dfs(p->left);    if(p->right) dfs(p->right);}void judge(Tree t1,Tree t2){    if(t1==NULL&&t2==NULL) return ;    else if(t1&&t2){        judge(t1->left,t2->left);        judge(t1->right,t2->right);    }else ff=0;}int main(){    int t,x;    scanf("%d",&t);    while(t--){                scanf("%d %d",&n,&m);        for(int i=0;i<n;++i){            Tree t=NULL;            for(int j=0;j<m;++j){                scanf("%d",&x);                builetree(t,x);            }            tree[i]=t;        }        int ans=0,i,j;        for(i=0;i<n;++i){            int f=1;            for(j=i+1;j<n;++j){                ff=1;                judge(tree[i],tree[j]);                if(ff){f=0;break;}            }            if(f) ans++;        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击