• <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 tutorial on computer science

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              21 隨筆 :: 0 文章 :: 17 評論 :: 0 Trackbacks
               據說不作此題人生不完整。好吧。很久以前就做過了,寫過BFS,A*,和雙搜。A*用了200+ms,汗,BFS都比他快。正好這幾天在看搜索估價函數之類的東西,就把這道經典題拿出來,再做一遍,突然發現,估價函數+迭代加深搜索就是IDA*算法,好吧。以前傻傻看黑書的時候,理解不了A* ,覺得巨麻煩(現在也覺得挺麻煩),現在寫起來IDA*,覺得還挺簡潔,并且比較通用,而且這玩意又好寫又比較通用,就詳細研究了一下。看了別人的一個IDA*的算法,覺得寫的很簡潔很工整,就參詳了一下,然后改造成了自己的,A掉了1077題。樓教主寫的那個百度之星的版本的Allyes.com,還沒有詳細看,覺得有點復雜。有機會要好好研究下。
               我感覺IDA*的主要的價值在于,在深度搜索的時候,可以把問題的條件放寬,只要找到一個接近并且小于實際解的估價函數,就可以非常快的得到解了。而尋求估價函數的過程,非常的有意思,可以轉換成各種經典問題。下面是代碼,我覺得還算工整吧。
            #include <cstdio>
            #include <cstring>


            char board[3][3];

            int dest_goal[9][2] = {{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}}; 

            int val[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};  //r,l,d,u

            char op[4] ={'r','d','u','l'};

            char solution[100];

            int find;

            int testdata,low_bound;

            int abs(int i)
            {
              if(i>0) return i; return -i;
            }

            void swap(char& a,char& b)
            {
              char c = a; a= b;b = c;
            }

            int getH()
            {
               int i,j;
               int nRet = 0;
               for(i=0;i<3;i++)
                for(j=0;j<3;j++)
                {
                  if(board[i][j] != 'x')
                    nRet += abs(i - dest_goal[board[i][j] - '1'][0]) + abs(j - dest_goal[board[i][j] - '1'][1] );
                }
               return nRet;
            }

            int bound(int x,int y)
            {
              if(x<0||y<0||x>=3||y>=3)  return 0;
              return 1;
            }

            int min(int a,int b)
            {
                if(a>b) return b; return a; 
            }

            int dfs(int x,int y,int step,int maxstep)
            {
               if(getH() == 0 || find == 1)
               {
                 find = 1;
                 return step;
               }

               if(step + getH() > maxstep)
                 return step + getH();
              
               int i;
               int now_bound = 100000;
               for(i=0;i<4;i++)
               {
                 int nx = x + val[i][0];
                 int ny = y + val[i][1];
                 if(bound(nx,ny))
                 {
                   swap(board[x][y],board[nx][ny]);
                   solution[step] = op[i]; 
                   int next_bound = dfs(nx,ny,step+1,maxstep);
                   now_bound = min(now_bound,next_bound);
                   if(find == 1)
                     return now_bound;
                   swap(board[x][y],board[nx][ny]);
                 }
               }
               return now_bound;
            }
            int main()
            {
               freopen("in_1077.txt","r",stdin);
               freopen("out.txt","w",stdout);
               int i,j,sx,sy;
               char c;
               for(i=0;i<3;i++)
                for(j=0;j<3;j++)
                {
                   while(scanf("%c",&board[i][j]) && board[i][j] == ' ')
                     NULL;
                   if(board[i][j] == 'x')
                   {
                    sx = i;
                    sy = j;
                   }
                }
               
               find = 0;
               low_bound = getH();
               while(low_bound < 100 && !find) //如果啟發函數比較好(很靠近結果并且小于結果),基本上很少次迭代就可以出結果。時間浪費在迭代次數上 
               {
                 low_bound = dfs(sx,sy,0,low_bound);
               }
               
               if(find)
                 {
                   solution[low_bound] = '\0';
                   printf("%s\n",solution);
                 }
               else if(find == 0)
                 printf("unsolvable\n");
               return 0;
            }
            posted on 2012-04-07 22:57 bigrabbit 閱讀(3214) 評論(1)  編輯 收藏 引用

            評論

            # re: IDA*算法-POJ1077 2012-04-10 09:16 tb
            學習算法了   回復  更多評論
              

            # re: IDA*算法-POJ1077[未登錄] 2013-09-07 12:35 Peter
            搔年,copy也是要動腦子的,比如說這一句

            while(low_bound < 100 && !find) //如果啟發函


            為什么你的最大上界要設置成 low_bound < 100 呢??  回復  更多評論
              

            国产成人精品久久亚洲高清不卡 | 亚洲国产精品综合久久网络| 久久久国产乱子伦精品作者| 久久99国产精品久久99果冻传媒| 日本精品久久久久中文字幕8| 久久99亚洲综合精品首页| 亚洲伊人久久综合中文成人网| 亚洲AV无码久久精品成人| 久久亚洲国产午夜精品理论片| 亚洲国产成人久久一区WWW| 18岁日韩内射颜射午夜久久成人| 久久久青草久久久青草| 亚洲国产天堂久久久久久| 九九久久99综合一区二区| yy6080久久| 久久久久久青草大香综合精品| 国产精品对白刺激久久久| 久久一区二区免费播放| 国产一区二区三区久久| 亚洲va久久久噜噜噜久久男同| 国产亚洲美女精品久久久| 99re久久精品国产首页2020| 久久天天躁狠狠躁夜夜躁2014| 久久国产午夜精品一区二区三区| 国产综合久久久久久鬼色| 热99RE久久精品这里都是精品免费| 久久成人影院精品777| 久久久久亚洲AV片无码下载蜜桃| 合区精品久久久中文字幕一区 | 久久无码人妻精品一区二区三区| 色欲综合久久躁天天躁蜜桃| 精品国产乱码久久久久久人妻| 国产精品欧美久久久久无广告| 久久精品国产福利国产秒| 77777亚洲午夜久久多喷| 欧洲成人午夜精品无码区久久 | 久久久久99精品成人片试看| 亚洲精品无码久久久久久| 无遮挡粉嫩小泬久久久久久久| 无码人妻精品一区二区三区久久久 | 久久人人爽人人爽人人片AV不|