• <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 閱讀(211) 評論(0)  編輯 收藏 引用

            導航

            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            午夜精品久久久久9999高清| 久久国产色AV免费看| 欧美久久亚洲精品| 亚洲伊人久久成综合人影院| 中文字幕久久精品无码| 国产69精品久久久久99尤物| 色综合久久综合中文综合网| 久久99国产一区二区三区| 久久人人爽人人爽人人AV东京热| 丰满少妇人妻久久久久久4| 久久久久久国产精品美女| 色综合色天天久久婷婷基地| 伊人久久综合无码成人网| 久久久久18| 91精品国产综合久久香蕉 | 亚洲精品99久久久久中文字幕| 色婷婷综合久久久久中文| 午夜精品久久久久久| 国内精品伊人久久久久网站| 久久久久久夜精品精品免费啦 | 久久久久国色AV免费看图片| 久久精品国产亚洲AV电影| 狠狠色狠狠色综合久久| 亚洲午夜精品久久久久久app| 国产精品成人精品久久久| 久久精品成人国产午夜| 韩国三级大全久久网站| av无码久久久久不卡免费网站| 久久久免费精品re6| 久久香蕉国产线看观看精品yw| 人妻久久久一区二区三区| 久久99久久99精品免视看动漫| 亚洲αv久久久噜噜噜噜噜| 日本强好片久久久久久AAA| 亚洲精品无码久久久久sm| 热re99久久6国产精品免费| 人妻精品久久久久中文字幕69| 99精品国产在热久久无毒不卡 | 91精品国产91久久久久久青草 | 武侠古典久久婷婷狼人伊人| 婷婷久久五月天|