• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評(píng)論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            POJ 1478 Island of Logic 枚舉

            思路:
            由于數(shù)據(jù)量比較小,可以枚舉ABCDE的所有身份和時(shí)間(白天或者晚上),不會(huì)超時(shí)。
            判斷deducible、impossible的部分很難寫,基本上是照著數(shù)據(jù)改的。。
            1. 如果沒(méi)有任何狀態(tài)是符合要求的,輸出 impossible。
            2. 在符合要求的狀態(tài)中,如果對(duì)于某個(gè)人的身份或者時(shí)間,存在分歧,那該條就不能輸出。
            3. 在(2)的情況下,如果沒(méi)有任何輸出,就輸出 deducible。

            快被這玩意整瘋了。要是沒(méi)有數(shù)據(jù)肯定搞不出來(lái)。


            #include <stdio.h>

            #define MAX_N 6

            enum kind_t {
                NONE, 
                
                ROLE_START, 
                DIVINE 
            = ROLE_START, HUMAN, EVIL, 
                ROLE_END 
            = EVIL,
                ANY_ROLE,

                LYING, 
                
                TIME_START, 
                DAY 
            = TIME_START, 
                NIGHT, 
                TIME_END 
            = NIGHT,
                ANY_TIME
            }
            ;

            char *str_tbl[] = 
                
            "none"
                
            "divine""human""evil""any_role"
                
            "lying"
                
            "day""night""any_time"
            }
            ;

            struct node {
                
            int x, y, not, type;
            }
            ;
            struct node in[64];

            struct stat {
                
            int role[MAX_N], time;
            }
            ;
            struct stat ans, cur;

            int N;

            __inline 
            void input(struct node *t)
            {
                
            char a[32], b[32];

                scanf(
            "%s%s", a, b);
                t
            ->= a[0- 'A';
                
            if (b[0== 'I')
                    t
            ->= t->x;
                
            else
                    t
            ->= b[0- 'A';
                scanf(
            "%s%s", a, b);
                
            if (b[0== 'n' && b[1== 'o'{
                    t
            ->not = 1;
                    scanf(
            "%s", b);
                }
             else 
                    t
            ->not = 0;
                
            if (b[0== 'd')
                    t
            ->type = (b[1== 'a'? DAY : DIVINE;
                
            else if (b[0== 'h')
                    t
            ->type = HUMAN;
                
            else if (b[0== 'e')
                    t
            ->type = EVIL;
                
            else if (b[0== 'l')
                    t
            ->type = LYING;
                
            else 
                    t
            ->type = NIGHT;
            }


            __inline 
            int lies(int x)
            {
                
            return (cur.role[x] == EVIL) || (cur.role[x] == HUMAN && cur.time == NIGHT);
            }


            __inline 
            int check_one(struct node *t)
            {
                
            int right;

                
            if (t->type >= ROLE_START && t->type <= ROLE_END)
                    right 
            = t->not ^ (cur.role[t->y] == t->type);
                
            else if (t->type == LYING)
                    right 
            = t->not ^ lies(t->y);
                
            else {
                    
            if (t->type == DAY)
                        right 
            = (cur.time == DAY);
                    
            else
                        right 
            = (cur.time == NIGHT);
                }


                
            return lies(t->x) ? !right : right;
            }


            __inline 
            void check()
            {
                
            int i;

                
            for (i = 0; i < N; i++
                    
            if (!check_one(&in[i]))
                        
            return ;

                
            for (i = 0; i < MAX_N; i++{
                    
            if (ans.role[i] == NONE)
                        ans.role[i] 
            = cur.role[i];
                    
            else if (ans.role[i] != cur.role[i])
                        ans.role[i] 
            = ANY_ROLE;
                }

                
            if (ans.time == NONE)
                    ans.time 
            = cur.time;
                
            else if (ans.time != cur.time)
                    ans.time 
            = ANY_TIME;
            }


            __inline 
            void solve()
            {
                
            int i, mask, cnt, *arr[MAX_N];

                mask 
            = 0;
                
            for (i = 0; i < N; i++{
                    mask 
            |= 1 << in[i].x;
                    mask 
            |= 1 << in[i].y;
                }


                
            for (cnt = i = 0; i < MAX_N; i++{
                    
            if (mask & (1 << i)) {
                        arr[cnt
            ++= &cur.role[i];
                        cur.role[i] 
            = ROLE_START;
                    }
             else
                        cur.role[i] 
            = NONE;
                    ans.role[i] 
            = NONE;
                }

                ans.time 
            = NONE;

                
            while (1{
                    cur.time 
            = DAY;
                    check();
                    cur.time 
            = NIGHT;
                    check();
                    
            for (i = 0; i < cnt && *arr[i] == ROLE_END; i++)
                        
            *arr[i] = ROLE_START;
                    
            if (i == cnt)
                        
            break;
                    (
            *arr[i])++;
                }

            }


            __inline 
            void dump()
            {
                
            int i, cnt;

                
            for (i = 0; i < MAX_N && ans.role[i] == NONE; i++);
                
            if (i == MAX_N && ans.time == NONE) {
                    printf(
            "This is impossible.\n\n");
                    
            return ;
                }


                
            for (cnt = i = 0; i < MAX_N; i++{
                    
            if (ans.role[i] >= ROLE_START && ans.role[i] <= ROLE_END) {
                        cnt
            ++;
                        printf(
            "%c is %s.\n", i + 'A', str_tbl[ans.role[i]]);
                    }

                }
                
                
            if (ans.time >= TIME_START && ans.time <= TIME_END) {
                    printf(
            "It is %s.\n", str_tbl[ans.time]);
                    cnt
            ++;
                }


                
            if (!cnt) {
                    printf(
            "No facts are deducible.\n\n");
                    
            return ;
                }


                putchar(
            '\n');
            }


            int main()
            {
                
            int i, t;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                
            for (t = 1; scanf("%d"&N), N; t++{
                    
            for (i = 0; i < N; i++)
                        input(
            &in[i]);
                    printf(
            "Conversation #%d\n", t);
                    solve();
                    dump();
                }


                
            return 0;
            }

            posted on 2010-03-30 16:42 糯米 閱讀(541) 評(píng)論(0)  編輯 收藏 引用 所屬分類: POJ

            欧美伊香蕉久久综合类网站| 久久久久99精品成人片| 久久婷婷五月综合97色| 72种姿势欧美久久久久大黄蕉| 久久精品亚洲一区二区三区浴池| 久久精品午夜一区二区福利| 91精品无码久久久久久五月天| 久久夜色精品国产| 国产精品99久久免费观看| 久久久久久无码国产精品中文字幕| 麻豆久久久9性大片| 久久精品草草草| 2021国内久久精品| 国产69精品久久久久99| 久久人妻AV中文字幕| 久久精品女人天堂AV麻| 久久无码人妻一区二区三区 | 国产精品免费久久久久电影网| 欧美久久久久久午夜精品| 久久精品国产精品亚洲毛片| 久久人人爽人人爽人人片AV东京热| 日日噜噜夜夜狠狠久久丁香五月| 精品综合久久久久久88小说| 97久久精品午夜一区二区| 久久久久久久精品成人热色戒| 99久久国产主播综合精品| 久久久久成人精品无码中文字幕 | 一级做a爰片久久毛片看看| 日韩亚洲欧美久久久www综合网| 亚洲中文字幕无码一久久区| 久久久久久一区国产精品| 狠狠色丁香婷婷综合久久来来去| 久久国产热精品波多野结衣AV| 久久精品国产免费观看三人同眠| 久久91精品综合国产首页| 94久久国产乱子伦精品免费 | 久久人妻少妇嫩草AV无码专区| 看全色黄大色大片免费久久久 | 成人久久免费网站| 久久精品国产欧美日韩99热| 亚洲国产高清精品线久久 |