• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

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

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據(jù)結果的正負來判斷給的點集的時針方向?
            • --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
            • 呵呵..把代碼發(fā)在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --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 閱讀(172) 評論(0)  編輯 收藏 引用
            亚洲精品无码久久久影院相关影片| 久久香综合精品久久伊人| 久久精品国产亚洲av高清漫画| 久久夜色精品国产网站| 国产99精品久久| 日韩欧美亚洲综合久久影院Ds | 国产成人久久精品一区二区三区| 国产精品久久永久免费| 久久伊人亚洲AV无码网站| 久久人人爽人人爽人人片av麻烦| 国产亚洲综合久久系列| 久久九九久精品国产免费直播| 99久久夜色精品国产网站| 精品久久久久久无码国产| 天堂久久天堂AV色综合| 九九热久久免费视频| 久久99精品久久久久久久不卡| 久久精品国产黑森林| 国产精品久久久久9999| 久久久久久曰本AV免费免费| 色成年激情久久综合| 欧美黑人激情性久久| 久久人人爽人人爽人人av东京热| 久久99国产精一区二区三区| 午夜精品久久久久久中宇| 日韩久久无码免费毛片软件| 93精91精品国产综合久久香蕉 | 久久99热这里只有精品国产| 国内精品久久久久伊人av| 久久综合久久美利坚合众国| 久久久久综合国产欧美一区二区 | 丁香久久婷婷国产午夜视频| 久久亚洲AV成人无码电影| 亚洲国产成人久久精品99| 国产成人无码精品久久久免费| 精品久久8x国产免费观看| 人妻精品久久久久中文字幕一冢本| 久久久久亚洲AV片无码下载蜜桃| 亚洲欧美日韩精品久久亚洲区 | 精品少妇人妻av无码久久| 国产精品一区二区久久不卡|