• <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>

            A Za, A Za, Fighting...

            堅信:勤能補拙

            2011搜索-題,BFS and DFS

            題目:
            給你一個3升的杯子和一個5升的(杯子是沒有刻度的),要你取4升水來(水可以無限取),請問該如何操作。
            泛化:
            給你一個m升的杯子和一個n升的(杯子是沒有刻度的),要你取target升水來(水可以無限取),請問該如何操作.
            思路:
            搜索: BFS or DFS

            分析:
            在讀完題目之后,首先想到就是歸納所有可行的操作,包括:
            1. 裝滿A
            2. 裝滿B
            3. 清空A
            4. 清空B
            5. 將A中的水倒入B中
            6. 將B中的水倒入A中

            如果要找到最少操作,使用BFS;如果要找到所有可能的操作,使用DFS

            代碼:

            /*
             * 題目:
             * 給你一個3升的杯子和一個5升的(杯子是沒有刻度的),要你取4升水來(水可以無限取),請問該如何操作。
             *
             * 泛化:
             * 給你一個m升的杯子和一個n升的(杯子是沒有刻度的),要你取target升水來(水可以無限取),請問該如何操作.
             *
             * 思路:
             * 搜索: BFS or DFS
             
            */
            #include
            <stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>

            #define CAPACITY_LIMIT 15 /* the maximum value of capacity of cups */
            #define STATE_LIMIT ((CAPACITY_LIMIT+1)*(CAPACITY_LIMIT+1))

            #define GET_BYTE_HIGH(state) (((state) & 0xF0)>>4)
            #define GET_BYTE_LOW(state) ((state) & 0x0F)
            #define SET_BYTE_HIGH(state, value)  do { ((state) &= 0x0F); \
                                                    ((state) 
            |= ((value)<<4)); } while(0)
            #define SET_BYTE_LOW(state, value)  do { ((state) &= 0xF0); \
                                                    ((state) 
            |= (value)); } while(0)

            int m, n, target;

            const char *ops_name[] = {
                
            "FILL A",
                
            "FILL B",
                
            "EMPTY A",
                
            "EMPTY B",
                
            "FROM A TO B",
                
            "FROM B TO A" };

            struct State {
                unsigned 
            char state;
                
            char op;
                
            char prev;
            } queue[STATE_LIMIT], tmp;

            int head, tail;
            char visited[STATE_LIMIT];

            void
            bfs_inner(
            int a, int b, int op)
            {
                
            int c;
                tmp.op 
            = op;
                tmp.state 
            = queue[head].state;
                
            switch(op) {
                    
            case 0:
                        
            /* FILL A */
                        SET_BYTE_HIGH(tmp.state, m);
                        
            break;
                    
            case 1:
                        
            /* FILL B */
                        SET_BYTE_LOW(tmp.state, n);
                        
            break;
                    
            case 2:
                        
            /* EMPTY A */
                        SET_BYTE_HIGH(tmp.state, 
            0);
                        
            break;
                    
            case 3:
                        
            /* EMPTY B */
                        SET_BYTE_LOW(tmp.state, 
            0);
                        
            break;
                    
            case 4:
                        
            /* FROM A TO B */
                        c 
            = a > (n-b) ? (n-b) : a;
                        SET_BYTE_LOW(tmp.state, b
            +c);
                        SET_BYTE_HIGH(tmp.state, a
            -c);
                        
            break;
                    
            case 5:
                        
            /* FROM B TO A */
                        c 
            = b > (m-a) ? (m-a) : b;
                        SET_BYTE_HIGH(tmp.state, a
            +c);
                        SET_BYTE_LOW(tmp.state, b
            -c);
                        
            break;
                }    
                
            if(!visited[tmp.state]) {
                    visited[tmp.state] 
            = 1;
                    
            ++tail;
                    memcpy(queue
            +tail, &tmp, sizeof(struct State));
                }
            }

            void
            print_bfs_ret(
            int index)
            {
                
            if(index == -1)
                    
            return;
                print_bfs_ret(queue[index].prev);
                printf(
            "%s:\tA(%d), B(%d)\n", queue[index].prev==-1 ? "Init State" : ops_name[queue[index].op], 
                        GET_BYTE_HIGH(queue[index].state), GET_BYTE_LOW(queue[index].state));
            }

            int
            bfs()
            {
                
            int a, b, op;
                memset(visited, 
            0sizeof(char)*STATE_LIMIT);
                memset(queue, 
            0sizeof(struct State)*STATE_LIMIT);

                head 
            = -1;
                tail 
            = 0;
                
            /* init state, push into queue */
                queue[tail].state 
            = 0;
                queue[tail].op 
            = -1;
                queue[tail].prev 
            = -1;
                visited[queue[tail].state] 
            = 1;
                
            while(head < tail) { /* while queue's not empty */
                    
            ++head;
                    a 
            = GET_BYTE_HIGH(queue[head].state);
                    b 
            = GET_BYTE_LOW(queue[head].state);
                    
            if(a==target || b==target) /* find it */
                        
            return 1;

                    tmp.prev 
            = head;
                    
            for(op=0; op<6++op) {
                        bfs_inner(a, b, op);
                    }    
                }
                
            return 0;
            }

            int
            state_cal(
            int state, int op, int a, int b)
            {
                
            int c;
                
            switch(op) {    
                    
            case 0:
                        
            /* FILL A */
                        SET_BYTE_HIGH(state, m);
                        
            break;
                    
            case 1:
                        
            /* FILL B */
                        SET_BYTE_LOW(state, n);
                        
            break;
                    
            case 2:
                        
            /* EMPTY A */
                        SET_BYTE_HIGH(state, 
            0);
                        
            break;
                    
            case 3:
                        
            /* EMPTY B */
                        SET_BYTE_LOW(state, 
            0);
                        
            break;
                    
            case 4:
                        
            /* FROM A TO B */
                        c 
            = a > (n-b) ? (n-b) : a;
                        SET_BYTE_LOW(state, b
            +c);
                        SET_BYTE_HIGH(state, a
            -c);
                        
            break;
                    
            case 5:
                        
            /* FROM B TO A */
                        c 
            = b > (m-a) ? (m-a) : b;
                        SET_BYTE_HIGH(state, a
            +c);
                        SET_BYTE_LOW(state, b
            -c);
                        
            break;
                    
            default:
                        state 
            = -1;
                }
                
            return state;
            }

            int dfs_visited[STATE_LIMIT];
            int record[STATE_LIMIT];

            void
            dfs(
            int depth, int state)
            {
                
            int a, b, op;
                a 
            = GET_BYTE_HIGH(state);
                b 
            = GET_BYTE_LOW(state);
                
            if(a==4 || b==4) {
                    
            /* result print */
                    
            int i;
                    
            for(i=0; i<depth; ++i)
                        printf(
            "%s\n", ops_name[record[i]]);
                    printf(
            "--------------------------------------\n");
                    
            return;
                }
                dfs_visited[state] 
            = 1;
                
            for(op=0; op<6++op) {
                    
            int nstate = state_cal(state, op, a, b);
                    
            if(!dfs_visited[nstate]) {
                        record[depth] 
            = op;
                        dfs(depth
            +1, nstate);
                    }
                }
                dfs_visited[state] 
            = 0;
            }

            int
            main(
            int argc, char **argv)
            {
                printf(
            "Enter capacity of A: ");
                scanf(
            "%d"&m);
                printf(
            "Enter capacity of B: ");
                scanf(
            "%d"&n);
                printf(
            "Enter target: ");
                scanf(
            "%d"&target);

                dfs(
            00);
                
            return;
            }


            posted on 2011-08-12 17:40 simplyzhao 閱讀(208) 評論(0)  編輯 收藏 引用

            導航

            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久人妻少妇嫩草AV蜜桃| 久久人人爽人人爽人人爽 | 国产农村妇女毛片精品久久| 久久青青草原精品影院| 国产高清国内精品福利99久久| 精品一久久香蕉国产线看播放| 久久乐国产综合亚洲精品| 国产亚洲美女精品久久久久狼| 久久久久综合网久久| 伊人久久亚洲综合影院| 91精品国产综合久久精品| 香港aa三级久久三级老师2021国产三级精品三级在 | 伊人色综合久久天天| 一级女性全黄久久生活片免费 | 久久人人超碰精品CAOPOREN| 久久国产色av免费看| 97精品国产97久久久久久免费| 狠狠综合久久AV一区二区三区| 久久亚洲国产精品一区二区| 中文字幕无码精品亚洲资源网久久| 久久精品国产99国产精偷| 亚洲午夜久久久久久噜噜噜| 久久久91人妻无码精品蜜桃HD | 国产精品久久久久影视不卡 | 91精品国产综合久久精品| 波多野结衣久久精品| 久久久这里有精品| 久久精品国产欧美日韩| 伊人久久综合热线大杳蕉下载| 韩国免费A级毛片久久| 亚洲欧美伊人久久综合一区二区 | 欧美亚洲日本久久精品| 久久久青草青青亚洲国产免观| AV狠狠色丁香婷婷综合久久| 五月丁香综合激情六月久久| 久久亚洲sm情趣捆绑调教| 亚洲精品综合久久| 精品久久人人爽天天玩人人妻| 一本综合久久国产二区| 老男人久久青草av高清| 伊人久久大香线蕉综合热线|