• <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 糯米 閱讀(594) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            99999久久久久久亚洲| 久久黄色视频| …久久精品99久久香蕉国产| 久久精品麻豆日日躁夜夜躁| 91亚洲国产成人久久精品网址| 国产免费福利体检区久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 日韩AV无码久久一区二区 | 久久久久久亚洲精品影院| 熟妇人妻久久中文字幕| 国产综合久久久久| 亚洲精品tv久久久久| 久久亚洲高清观看| 国产激情久久久久久熟女老人| 97久久精品无码一区二区| 日韩精品久久久久久久电影| 国产精品九九九久久九九| 久久久久波多野结衣高潮| 久久精品国产只有精品66 | 久久久久国产视频电影| 久久天堂AV综合合色蜜桃网 | 久久精品一区二区三区中文字幕 | 久久精品人妻中文系列| 无码8090精品久久一区| 爱做久久久久久| 久久久久久a亚洲欧洲aⅴ | 久久噜噜电影你懂的| 国内精品久久久久久久97牛牛| 狠狠色婷婷久久一区二区| 日批日出水久久亚洲精品tv| 热99re久久国超精品首页| 国产精品久久久久…| 国产精品99久久久久久人| 国产成人精品久久免费动漫| 久久国产精品无码一区二区三区| 亚洲精品国产美女久久久| 99久久精品免费看国产一区二区三区| 国产精品久久久久久久久软件| 欧美久久久久久| 久久精品青青草原伊人| 久久精品99久久香蕉国产色戒|