scau_伪Acmer的推理(dfs)

17232 伪Acmer的推理

时间限制:1000MS  内存限制:65535K
提交次数:12 通过次数:9 收入:32

题型: 编程题   语言: G++;GCC

Description

现在正是期末,在复习离散数学的Acmer遇到了问题,你能帮助他吗?
Acmer正在复习的是推理,不过他的推理系统可能与别人的不一样。
(所以说他是一个伪Acmer~。做完这题,请自觉把这里伪Acmer自己定义的概念忘了。。否则到时学离散的时候混淆了概念的话自重。。。)
他的推理系统定义如下:
1.用大写英文字母A-Z表示一个命题。
2.用A→B表示若命题A成立则命题B成立。
3.用A↔B表示A→B且B→A。
(这里2,3皆表示一种逻辑关系。)
推理就是由若干个命题或逻辑关系出发,推出新的命题或逻辑关系。
如,已知A→B和B→C,我们可以推出A→C。
又如,已知A→B和A,我们可以推出B。
再如,如果仅有A、B成立,是不可以推出A→B的。
。。。。。。
现在Acmer已经知道了n个命题或逻辑关系是成立的。而且,他从这些前提出发,又推出了m个新的命题或逻辑关系出来。
不过,他的推理过程并不一定正确。所以,你能告诉他这m个结论中哪些是正确的,哪些是错误的吗?



输入格式

单case输入。
第一行是一个整数n(0<=n<=100)。
接下来n行,每行表示1个已知成立的命题或逻辑关系。
每行首先是一个数字x(1<=x<=3),
  若是1,后面接一个大写英文字母,表示一个命题。
  若是2,后面接两个大写英文字母,表示逻辑关系→。
  若是3,后面接两个大写英文字母,表示逻辑关系↔。
接着是一个整数m(0 < m <= 100)。
接下来m行,每行表示1个要求判断正误的命题或逻辑关系。
每行的格式同上。


输出格式

输出m行。对每个要你判断的结论,正确的话输出“yes”,否则输出“no”。


输入样例

Sample#1:
2
2	A 	B
2	B	C
1
2	A	C

Sample#2:
1
2	A	B
1
1	B

Sample#3:
2
2	A	B
1	A
1
1	B


输出样例

Sample#1:
yes

Sample#2:
no

Sample#3:
yes


提示

Sample#不是输入输出的一部分。
注意区别命题和逻辑关系成立的不同。


这道题是常规的DFS题目,可能也可以用并查集,这里给出DFS的思路
本题有一个卡了我很久的地方,就是scanf(%c,&c);读取字母时会读到空格,这里我用字符串来保存读到的字母,比较傻的思路。
最后给出代码纪念一下
#include 
#include 
#include 
#include 
using namespace std;
int luo[110][110]= {0},a[30]= {0},vis[30]= {0},b[30]= {0};
int dfs(int u)
{
    vis[u]=1;
    for(int i=1; i<=30; i++)
    {
        if(!vis[i]&&luo[u][i]&&a[u])
        {
            a[i]=i;
            dfs(i);
        }

    }
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int x;
        scanf("%d",&x);
        // char ccc=getchar();
        if(x==1)
        {
            char c[2];
            scanf("%1s",&c);
            int i=c[0]-64;
            a[i]=i;
            b[i]=i;
        }
        else if(x==2)
        {
            char c1[2],c2[2];
            scanf("%1s",&c1);
            scanf("%1s",&c2);
            //scanf("%c",&c1);
            //char ss=getchar();
            //scanf("%c",&c2);
            int n1=c1[0]-64;
            int n2=c2[0]-64;
            luo[n1][n2]=1;
        }
        else if(x==3)
        {
            char c3[2],c4[2];
            scanf("%1s",&c3);
            scanf("%1s",&c4);
            // scanf("%c",&c3);
            // char ss1=getchar();
            // scanf("%c",&c4);
            int n3=c3[0]-64;
            int n4=c4[0]-64;
            luo[n3][n4]=1;
            luo[n4][n3]=1;
        }
    }
    int m;
    scanf("%d",&m);
    while(m--)
    {
        int y;
        scanf("%d",&y);
        //char cc2=getchar();
        if(y==1)
        {
            char cc[2];
            scanf("%1s",&cc);
            int nn=cc[0]-64,flag=0;
            if(a[nn])printf("yes\n");
            else
            {
                for(int i=1; i<=30; i++)
                {
                    if(i==nn)continue;
                    memset(vis,0,sizeof(vis));
                    dfs(i);
                    if(a[nn])
                    {
                        printf("yes\n");
                        flag=1;
                        break;
                    }
                }
                if(!flag)printf("no\n");

            }
        }
        else if(y==2)
        {
            char cc1[2],cc2[2];
            scanf("%1s",&cc1);
            scanf("%1s",&cc2);
            //scanf("%c",&cc1);
            //char ss2=getchar();
            //scanf("%c",&cc2);
            int nn1=cc1[0]-64;
            int nn2=cc2[0]-64;
            if(nn1==nn2&&a[nn1])
            {
                printf("yes\n");
            }
            else
            {
                memset(vis,0,sizeof(vis));
                a[nn1]=nn1;
                a[nn2]=0;
                dfs(nn1);
                //printf("nn1=%d\n",nn1);
                //printf("cc1[0]=%c\n",cc1[0]);
                //for(int i=0;i<30;i++)
                //{
                //    printf("%d %d\n",i,a[i]);
                //}
                if(a[nn2])printf("yes\n");
                else printf("no\n");
            }

        }
        else if(y==3)
        {
            char cc3[2],cc4[2];
            int f1=0,f2=0;
            scanf("%1s",&cc3);
            scanf("%1s",&cc4);
            //scanf("%c",&cc3);
            // char ss3=getchar();
            // scanf("%c",&cc4);
            int nn3=cc3[0]-64;
            int nn4=cc4[0]-64;
            memset(vis,0,sizeof(vis));
            a[nn3]=nn3;
            a[nn4]=0;
            dfs(nn3);
            if(vis[nn4])f1=1;
            a[nn3]=0;
            a[nn4]=nn4;
            memset(vis,0,sizeof(vis));
            dfs(nn4);
            if(vis[nn3])f2=1;
            if(f1&&f2)printf("yes\n");
            else printf("no\n");
        }
        for(int i=0; i<30; i++)
        {
            a[i]=b[i];
        }
    }
    return 0;
}

你可能感兴趣的:(scau_伪Acmer的推理(dfs))