我真的真的真的很想知道答案,谢谢将要路过了的,进来了的大牛了们,感激不尽呐
程序代码:
这是输入输出: I 1 5 ttt is aaa ttt is bbb aaa is bbb aaa is ttt bbb is not aaa O 4 说明: 第一行表示测试数据组数 第二行表示每组的语句数 之后N行表示语句 输出表示最先产生矛盾的行数,若没有矛盾,输出0 为了不耽搁大牛们过多的时间,也为了体现我真的想知道问题出错到哪的诚意,我简要说明一下我的思想。 我认为对于每组例子,逐行扫描语句,这就相当于构建一个有向图的过程,每次在添加点和边之前要确认这条边是否与当前的图冲突, 即产生无向边的时候就说明出错啦,返回该行号即可;若能在当前的图中通过传递性找到了该边,就说明不矛盾,返回局部正确的0即可; 若在当前图中没找到,就说明也不矛盾,添加该边即可,返回局部正确的0即可。 这是我想了好几天的思想和程序,可以运行过去,但是当我输入第二行语句时,程序就崩了,意外就停止工作了,请高人为我指点迷津。 我也算是学了两年的c了,总感觉自己还不够游刃有余,差的远,可能脑子笨点,能有大牛给我说说我该怎木提高自己的思维和编程能力吗,好歹 我也想在大学期间获获奖 #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 i; //在当前数组中查找 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(qq,xinde[i].y); //若两相等且.num==temp,说明找到了该语句 if(strcmp(qq,weixin)==0&&temp) return 1; //若.num!=temp,说明两个语句相互矛盾 if(strcmp(qq,weixin)==0&&!temp) return 0; //其他情况说明还在中间节点,还需往下走 panduan(qq,weixin,temp,xinde,xianzai); } //如果.num==0 else { //如果temp==0 if(!temp) { strcpy(qq,xinde[i].y); //如果两个相等了说明找到了原语句 if(strcmp(qq,weixin)==0) return 1; //其他情况由于路不通所以终止,所以省略了continue } } } } //若循环结束后还仍为返回,就说明与当前不冲突 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]; if(string[i+7]!=' ') { for(l=i+4;string[l]!='\0';l++) weixin[l-i-4]=string[l]; temp=1; } else { for(l=i+8;string[l]!='\0';l++) weixin[l-i-8]=string[l]; temp=0; } //判断*xianzai是否为0,为0就储存在结构体数组xinde中 if(!*xianzai) { 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); if(value==0) return j+1; 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[20]; int i=0; liangshu xinde[200]; int xianzai=0; //输入需要测试几组 scanf("%d",&T); while(i<T){ //输入每组测试的句子数 scanf("%d",&N); semaphore=1; for(j=0;j<N;j++) { //输入每个句子 scanf("%s",string); //对于每组要是发现返回值不为零就跳出,并保存 if(semaphore) answer[i]=jiexi(string,j,xinde,&xianzai); if(answer[i]!=0) semaphore=0; } i++; } for(i=0;i<T;i++) //输入每组测试的结果 printf("%d\n",answer[i]); return 0; }