我真的真的真的很想知道答案,谢谢将要路过了的,进来了的大牛了们,感激不尽呐
程序代码:这是输入输出:
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;
}









