祝大家国庆快乐
程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> //定义结构体装is前后两个量,num判断是否有not,有为0 struct liangshu{ char x[4]; char y[4]; int num; }; int panduan(char qq[],char weixin[],int temp,liangshu xinde[],int xianzai,int count){ int i; char newqq[4]; //在当前数组中查找 strcpy(newqq,qq); for(i=0;i<xianzai;i++) { //找到与当前qq字符串相等的字符串 if(strcmp(qq,xinde[i].x)==0) { //xinde[i]的num若存在,就说明.x与.y之间有路 if(xinde[i].num==1) { //复制.y字符串给qq strcpy(newqq,xinde[i].y); //若两相等且.num==temp,说明找到了该语句 if(strcmp(newqq,weixin)==0&&temp) return 1; //若.num!=temp,说明两个语句相互矛盾 if(strcmp(newqq,weixin)==0&&!temp) return 0; //其他情况说明还在中间节点,还需往下走 panduan(newqq,weixin,temp,xinde,xianzai,count+1); } //如果.num==0 else { //如果temp==0 if(!temp) { strcpy(newqq,xinde[i].y); //如果两个相等了说明找到了原语句 if(strcmp(newqq,weixin)==0) return 1; else continue; //其他情况由于路不通所以终止,所以省略了continue } else continue; } } else { if(strcmp(xinde[i].x,weixin)==0&&strcmp(xinde[i].y,qq)==0&&temp+xinde[i].num==2) return 0; else continue; } } //若循环结束后还仍为返回,就说明与当前不冲突 if(count==1) return -1; } int jiexi(char string[20],int j,liangshu xinde[200],int *xianzai){ char qq[4]; char weixin[4]; int i; int l; int value; int temp; //分析字符串,取出is前后两个量以及是否有not, for(i=0;string[i]!=' ';i++) qq[i]=string[i]; qq[i]='\0'; if(string[i+7]!=' ') { for(l=i+4;string[l]!='\0';l++) weixin[l-i-4]=string[l]; weixin[l-i-4]='\0'; temp=1; } else { for(l=i+8;string[l]!='\0';l++) weixin[l-i-8]=string[l]; weixin[l-i-8]='\0'; temp=0; } //printf("%s",weixin); //判断*xianzai是否为0,为0就储存在结构体数组xinde中 if(*xianzai==0) { strcpy(xinde[*xianzai].x,qq); strcpy(xinde[*xianzai].y,weixin); xinde[*xianzai].num=temp; (*xianzai)++; } //根据返回值做相应操作,若为0,说明有矛盾,返回该行行号;若为1,则说明 //在xinde数组中找到这样一条路;若为-1,则说明与当前不矛盾,将数据插入数组即可 else value=panduan(qq,weixin,temp,xinde,*xianzai,1); if(value==0) return j; if(value==-1) { strcpy(xinde[*xianzai].x,qq); strcpy(xinde[*xianzai].y,weixin); xinde[*xianzai].num=temp; (*xianzai)++; } return 0; } int main(){ int T; int N; int j; int semaphore; int answer[50]={0}; char string[50]; int i=0; liangshu xinde[200]; int xianzai=0; //输入需要测试几组 scanf("%d",&T); while(i<T){ //输入每组测试的句子数 scanf("%d",&N); N=N+1; semaphore=1; for(j=0;j<N;j++) { //输入每个句子 gets(string); //对于每组要是发现返回值不为零就跳出,并保存 if(j==0) continue; if(semaphore) answer[i]=jiexi(string,j,xinde,&xianzai); if(answer[i]!=0) semaphore=0; } i++; } for(i=0;i<xianzai;i++) //printf("%s %s\n",xinde[i].x,xinde[i].y); for(i=0;i<T;i++) //输入每组测试的结果 printf("%d\n",answer[i]); system("pause"); return 0; }