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

            學習心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據結果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            #include <stdio.h>
            #include 
            <memory.h>

            int  n, m, l, test;
            int  mv[4][2= {{0-1}, {-10}, {01}, {10}, };//left up right down
            int  pow[9= {01416642561024409616384};//for 4's pow

            bool tu[21][21];
            int  mym[21][21][65535];
            int  f[21][21];

            struct nod
            {
                
            int x, y, s, cost, step;
            };

            bool operator <(nod a, nod b)
            {
                
            return a.x < b.x || a.x == b.x && a.y < b.y ||
                    a.x 
            == b.x && a.y == b.y && a.s < b.s;
            }

            int si, sJ;
            nod ini;

            int cha(int x, int y)
            {
                
            if(x < 0return 1;
                
            if(x > 0return 3;
                
            if(y < 0return 0;
                
            if(y > 0return 2;
            }

            void read()
            {
                
            int i, x, y, tx, ty;
                scanf(
            "%d %d"&si, &sJ);
                x 
            = si; y = sJ;
                
            int ch = 0;
                
            for(i = 0; i < l - 1; i ++)
                {
                    scanf(
            "%d %d"&tx, &ty);
                    ch 
            = ch * 4 + cha(tx - x, ty - y);
                    x 
            = tx; 
                    y 
            = ty;
                }
                ini.s 
            = ch;
                ini.x 
            = si; ini.y = sJ;
                
            int stone;
                memset(tu, 
            0sizeof(tu));
                scanf(
            "%d"&stone);
                
            for(i = 0; i < stone; i ++)
                {
                    scanf(
            "%d %d"&x, &y);
                    tu[x][y] 
            = 1;
                }
            }

            int open, close, first;
            nod q[
            1000001];

            bool ok(nod t, int index)
            {
                
            short dx = t.x + mv[index][0], dy = t.y + mv[index][1];
                
            short x, y;;
                x 
            = t.x;
                y 
            = t.y;
                
            for(int i = 0; i < l - 1; i ++)
                {
                    x 
            = x + mv[ t.s / pow[l - 1 - i] ][0];
                    y 
            = y + mv[ t.s / pow[l - 1 - i] ][1];
                    
            if(x == dx && y == dy) return false;
                    t.s 
            = t.s % pow[l - 1 - i];
                }
                
            return true;
            }

            void change(int &ch, int i)
            {
                ch 
            = ch >> 2;
                ch 
            += ((i + 2% 4* pow[l - 1];
            }

            bool check(nod t)
            {
                
            short xx = t.x, yy = t.y;
                
            if(xx < 1 || xx > n || yy < 1 || yy > m) return false;
                
            if(tu[xx][yy]) return false;
                
            return true;
            }

            void heap(nod tp)
            {
                nod tmp;
                tmp 
            = q[++open] = tp;
                
            int i = open, J = i / 2;
                
            while( i > first)
                {
                    
            if( tmp.cost < q[J].cost && J > first)
                    {
                        q[i] 
            = q[J];
                        i 
            = J;
                        J 
            = i / 2;
                    }
                    
            else 
                        
            break;
                }
                q[i] 
            = tmp;
            }

            bool expend(nod temp)
            {
                nod t;
                
            for(int i = 0; i < 4; i ++)
                
            if(ok(temp, i))
                {
                    t 
            = temp;
                    t.x 
            += mv[i][0];
                    t.y 
            += mv[i][1];
                    t.step 
            ++;
                    
            if(t.x == 1 && t.y == 1return true;
                    change(t.s, i); 
                    
            if(check(t) && mym[t.x][t.y][t.s] != test)
                    {
                        mym[t.x][t.y][t.s] 
            = test;
                        t.cost 
            = f[t.x][t.y] + t.step;
                        heap(t);
                    }
                }
                
            return false;
            }

            int bfs()
            {
                nod temp;
                close 
            = -1;    open = 0;
                q[
            0= ini;
                q[
            0].cost = f[ini.x][ini.y];
                q[
            0].step = 0;
                
            if(ini.x == 1 && ini.y == 1return 0;
                mym[ini.x][ini.y][ini.s] 
            = test;
                
            int size;
                
            while(close < open)
                {
                    temp 
            = q[++ close];
                    first 
            = close + 1;
                    
            if(expend(temp)) return temp.step + 1;
                }
                
            return -1;
            }

            struct td{int x, y;}que[1001];
            bool ha[21][21];
            void pre()
            {
                close 
            = -1, open = 0;
                memset(ha,
            0,sizeof(ha));
                td t;
                que[
            0].x = 1;
                que[
            0].y = 1;
                ha[
            1][1= 1;
                f[
            1][1= 0;
                
            while(close < open)
                {
                    t 
            = que[++close];
                    
            for(int i = 0; i < 4; i ++)
                    {
                        
            int x = t.x + mv[i][0], y = t.y + mv[i][1];
                        
            if(x < 1 || x > n || y < 1 || y > m) continue;
                        
            if(ha[x][y] || tu[x][y]) continue;
                        ha[x][y] 
            = 1;
                        f[x][y] 
            = f[t.x][t.y] + 1;
                        que[
            ++open].x = x;
                        que[open].y 
            = y;
                    }
                }
            }

            int main()
            {
                freopen(
            "in.txt","r",stdin);
                test 
            = 0;
                
            while(scanf("%d %d %d"&n, &m, &l), n||m||l)
                {
                    read();
                    pre();
                    
            ++test;
                    printf(
            "Case %d: %d\n",test,bfs());
                }
                
            while(1);
            }

            posted on 2009-09-01 19:18 superlong 閱讀(170) 評論(0)  編輯 收藏 引用
            青青久久精品国产免费看| 色欲久久久天天天综合网精品 | 精品国产乱码久久久久软件| 久久精品免费一区二区三区| 69久久精品无码一区二区| 亚洲国产精品高清久久久| 久久亚洲日韩看片无码| 香蕉久久影院| 99久久这里只精品国产免费| 香蕉99久久国产综合精品宅男自 | 国产精品美女久久久久av爽| 久久成人国产精品二三区| 91久久成人免费| 久久久久亚洲AV成人网| 亚洲国产成人久久一区久久| 亚洲v国产v天堂a无码久久| 久久人人爽人人爽人人片av麻烦| 久久精品国产乱子伦| 7777久久亚洲中文字幕| 精品久久久久久久中文字幕| 一级做a爰片久久毛片毛片| 亚洲狠狠婷婷综合久久蜜芽| 国内精品久久久久影院免费| 国产精品丝袜久久久久久不卡 | 人妻少妇久久中文字幕一区二区| 日韩精品久久无码人妻中文字幕| 国产精品久久久久久| 亚洲国产成人久久综合一区77| 亚洲国产精品无码久久| 国产99久久久久久免费看| 久久婷婷色综合一区二区| 久久国产乱子精品免费女| 亚洲精品NV久久久久久久久久| 影音先锋女人AV鲁色资源网久久| 四虎国产精品免费久久5151| 色狠狠久久综合网| 91精品免费久久久久久久久| 久久精品一本到99热免费| 久久精品国产72国产精福利| 久久香蕉超碰97国产精品| 色婷婷久久综合中文久久一本|