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

            導航

            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久se色偷偷亚洲精品av| 亚洲精品白浆高清久久久久久| 久久综合国产乱子伦精品免费| 国产精品99久久久久久www| 久久中文娱乐网| 日日狠狠久久偷偷色综合96蜜桃 | 99精品久久久久久久婷婷| 亚洲精品高清国产一久久| 久久强奷乱码老熟女| 亚洲香蕉网久久综合影视| 免费观看久久精彩视频| 老司机午夜网站国内精品久久久久久久久 | 一级a性色生活片久久无| 97久久国产亚洲精品超碰热| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久超乳爆乳中文字幕| 久久精品人妻一区二区三区| 亚洲欧美日韩久久精品第一区| 国产精久久一区二区三区| 久久亚洲AV成人无码国产| 人人狠狠综合久久亚洲| 久久久久久综合一区中文字幕| 2019久久久高清456| 99久久精品免费看国产一区二区三区 | 无码人妻久久久一区二区三区| 国产综合成人久久大片91| 久久精品国产精品国产精品污| 久久亚洲日韩看片无码| 婷婷国产天堂久久综合五月| 日本福利片国产午夜久久| 99久久久精品| 精品999久久久久久中文字幕| 中文字幕无码免费久久| 国产欧美久久久精品影院| 久久一区二区三区99| 久久精品国产亚洲Aⅴ香蕉| 久久久无码一区二区三区| 亚洲精品tv久久久久久久久| 亚洲国产另类久久久精品小说| 麻豆av久久av盛宴av| 久久人与动人物a级毛片|