这是按题意做的,不知道能通过不。(按题意的例子已通过,要发邮件注册就免了)
程序代码:
#include <stdio.h> #include <stdlib.h> struct node { int next; char *p; }; int find(node *p,int dp,int l) { int i,j; char a; for(i=0,j=0;i<l;i++)if(p[i].next >=0)j++;; if(j==l-1)return 1; //如果连成串则返回 for(i=0;p[dp].p[i];i++); a=p[dp].p[i-1]; //找到字符串尾部字符 for(i=0;i<l;i++) { if(i!=dp&&p[i].next <0&&p[i].p[0]==a) { p[dp].next =i; if (find(p,i,l))return 1; else p[dp].next =-1; } } return 0; } void main() { int i,j,n,t; char a[1000],*pp; node *p; for(t=0,scanf("%d",&t);t>0;t--) { if(scanf("%d",&n)) { if(n>0) { p=(node*)malloc(sizeof(node)*(n+1)); //申请指针空间 for(i=0;i<n;i++) { scanf("%s",a); for(j=0;a[j];j++); p[i].p=(char*)malloc(j+1); //申请字符串空间 for(;j>=0;j--)p[i].p[j]=a[j]; //拷贝字符串到堆中 p[i].next =-1; } for(i=0;i<n;i++)if(find(p,i,n))break;; if(i==n) printf("The door cannot be opened.\n"); else printf("Ordering is possible.\n"); for(i=0;i<n;i++)free(p[i].p); //释放字符串堆空间 free(p); //释放指针空间 } } } }
能编个毛线衣吗?