• <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, 評論 - 47, 引用 - 0
            數據加載中……

            POJ 1048 Follow My Logic 有意思的題

            這題很有意思哇。給出一個這樣的東西:
            A---+
                |   
                +---:\
                    : >o---:\
                +---:/     : )---?
                |      C--o:/
            B---+

            其中:
                    :\               :\                 -:\                 -o:\                       A-o:\
                    : )              : >                 : )-                 : )o-                       : )o-?
                    :/               :/                 -:/                 --:/                       B--:/
               
                 AND gate          OR gate       Gate with inputs    An inverted top input          Two logic input
                                                                     and an inverted output         and the output


            然后叫你分析它的輸出。
            其實哥比較喜歡這種有創意的題,做這種題代碼也寫得比較有意思。


            #include <stdio.h>
            #include 
            <string.h>

            struct node {
                
            char type, n[3];
                
            struct node *child[2];
            }
            ;
            struct node nodes[128], *root;
            int nodes_cnt;
            char map[128][128], input[32];
            int W[128], H;

            int in_range(int dx, int dy)
            {
                
            return !(dx < 0 || dx >= W[dy] || dy < 0 || dy >= H);
            }


            void follow_path(int x, int y, struct node **p_node);

            int find_node(int x, int y, struct node **p_node)
            {
                
            struct node *t;

                
            if (map[y][x] >= 'A' && map[y][x] <= 'Z'{
                    t 
            = &nodes[nodes_cnt++];
                    t
            ->type = map[y][x];
                    
            *p_node = t;
                    
            return 1;
                }

                
            if (map[y][x] == 'o')
                    x
            --;
                
            if (map[y][x] == ')' || map[y][x] == '>'{
                    t 
            = &nodes[nodes_cnt++];
                    memset(t, 
            0sizeof(*t));
                    t
            ->type = map[y][x];
                    
            *p_node = t;
                    
            if (in_range(x - 3, y - 1&& map[y - 1][x - 3== 'o')
                        t
            ->n[0= 1;
                    
            if (in_range(x - 3, y + 1&& map[y + 1][x - 3== 'o')
                        t
            ->n[1= 1;
                    
            if (in_range(x + 1, y) && map[y][x + 1== 'o')
                        t
            ->n[2= 1;
                    follow_path(x 
            - 3, y - 1&t->child[0]);
                    follow_path(x 
            - 3, y + 1&t->child[1]);
                    
            return 1;
                }


                
            return 0;
            }


            void follow_path(int x, int y, struct node **p_node)
            {
                
            int i, dx, dy;
                
            const struct {
                    
            char ch;
                    
            int dx, dy;
                }
             dir[4= {
                    
            {'-'-10},
                    
            {'-'10},
                    
            {'|'01},
                    
            {'|'0-1}
                }
            ;

                
            while (1{
                    
            for (i = 0; i < 4; i++{
                        dx 
            = x + dir[i].dx;
                        dy 
            = y + dir[i].dy;
                        
            if (!in_range(dx, dy))
                            
            continue;
                        
            if (map[dy][dx] == dir[i].ch || map[dy][dx] == '+')
                            
            break;
                        
            if (find_node(dx, dy, p_node))
                            
            return ;
                    }

                    
            if (i == 4)
                        
            break;
                    map[y][x] 
            = '.';
                    x 
            = dx;
                    y 
            = dy;
                }


                
            *p_node = NULL;
            }


            int calc(struct node *t)
            {
                
            if (!t)
                    
            return 0;
                
            if (t->type >= 'A' && t->type <= 'Z')
                    
            return input[t->type - 'A'- '0';
                
            if (t->type == ')'
                    
            return ((calc(t->child[0]) ^ t->n[0]) & 
                            (calc(t
            ->child[1]) ^ t->n[1])) ^
                           t
            ->n[2];
                
            if (t->type == '>')
                    
            return ((calc(t->child[0]) ^ t->n[0]) | 
                            (calc(t
            ->child[1]) ^ t->n[1])) ^
                           t
            ->n[2];
                
            return 0;
            }


            void find_root()
            {
                
            int x, y;

                root 
            = NULL;
                
            for (y = 0; y < H; y++
                
            for (x = 0; x < W[y]; x++{
                    
            if (map[y][x] == '?'{
                        follow_path(x, y, 
            &root);
                        
            return ;
                    }

                }

            }


            int main()
            {

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

                
            while (1{
                    nodes_cnt 
            = 0;
                    H 
            = 0;
                    
            while (1{
                        
            if (!fgets(map[H], sizeof(map[H]), stdin))
                            
            return 0;
                        
            if (map[H][0== '*')
                            
            break;
                        W[H] 
            = strlen(map[H]);
                        H
            ++;
                    }

                    find_root();
                    
            while (1{
                        fgets(input, 
            sizeof(input), stdin);
                        
            if (input[0== '*')
                            
            break;
                        printf(
            "%d\n", calc(root));
                    }

                    printf(
            "\n");
                }


                
            return 0;
            }

            posted on 2010-02-13 02:11 糯米 閱讀(585) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            亚洲人成无码网站久久99热国产| 久久人人爽人人爽人人片AV麻烦| 97精品久久天干天天天按摩| 999久久久免费精品国产| 日本精品久久久久中文字幕8| 国产69精品久久久久99| 性做久久久久久久久久久| 人妻无码久久一区二区三区免费| 久久婷婷国产麻豆91天堂| 一本大道久久东京热无码AV| 国产亚洲欧美精品久久久| 青春久久| 久久777国产线看观看精品| 久久久精品人妻一区二区三区蜜桃 | 日韩精品久久久久久久电影蜜臀 | 国产午夜精品理论片久久影视| 国产午夜福利精品久久| 亚洲伊人久久综合中文成人网| 国产亚洲婷婷香蕉久久精品| 久久亚洲精品成人无码网站| 精品久久久久久久久久久久久久久| 色综合久久综合中文综合网| 亚洲色欲久久久久综合网| 精品久久久久久久中文字幕| 99国产欧美久久久精品蜜芽| 久久久一本精品99久久精品66| 午夜精品久久久久| 欧美久久久久久| 久久涩综合| 久久久久亚洲精品无码网址| 国产真实乱对白精彩久久| 91精品国产高清久久久久久91| 久久99国产精品尤物| 久久亚洲私人国产精品| 色偷偷偷久久伊人大杳蕉| 久久精品免费一区二区| 内射无码专区久久亚洲| 99久久久久| 狠狠色伊人久久精品综合网 | 久久精品国产亚洲av麻豆蜜芽| 伊人久久大香线蕉综合5g|