• <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都比他快。正好這幾天在看搜索估價函數之類的東西,就把這道經典題拿出來,再做一遍,突然發(fā)現,估價函數+迭代加深搜索就是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) //如果啟發(fā)函數比較好(很靠近結果并且小于結果),基本上很少次迭代就可以出結果。時間浪費在迭代次數上 
               {
                 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 閱讀(3220) 評論(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) //如果啟發(fā)函


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

            久久亚洲国产成人影院网站| 久久亚洲国产成人精品无码区| 中文字幕无码免费久久| 日韩人妻无码一区二区三区久久 | 亚洲人成伊人成综合网久久久| 伊人久久大香线蕉综合Av| 久久国产免费观看精品| 青草影院天堂男人久久| 国内精品综合久久久40p| 中文字幕亚洲综合久久| 99精品久久久久久久婷婷| 国内精品欧美久久精品| 亚洲AV无一区二区三区久久| 狠狠色伊人久久精品综合网 | 区久久AAA片69亚洲| 精品一区二区久久| 色婷婷综合久久久久中文一区二区 | 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 亚洲国产高清精品线久久 | 99久久99久久精品国产片| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久久无码精品午夜| 99久久中文字幕| 精品久久久久久亚洲精品| 久久久亚洲欧洲日产国码是AV | 日韩人妻无码精品久久免费一| 久久亚洲天堂| 蜜臀久久99精品久久久久久| 久久精品国产99国产电影网| 色88久久久久高潮综合影院 | 久久亚洲日韩看片无码| 午夜视频久久久久一区| 欧美麻豆久久久久久中文| 久久精品免费大片国产大片| 91精品国产综合久久香蕉| 青青草原综合久久大伊人精品| 国产99精品久久| 久久免费高清视频| 国产精品伊人久久伊人电影| 一本久久久久久久| 久久久久免费视频|