青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Fourth Dimension Space

枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

暑假專題訓練一 搜索::POJ 1077 八數碼 ——初識A*算法

特來YM+學習A*算法,A*果然快啊,在pku上曾經寫過一個BFS,300MS,去航電直優化的空間接TLE.用A*算法北大16MS,航電750MS,效率很高啊。當然我的A*寫得還不是特別好,航電上有16MS AC那道題的,看來這個A*還有優化的空間。
A*采用啟發式搜索的思維方式很值得借鑒!F=G+H
#include<iostream>
#include
<cmath>
#include
<algorithm>
#include
<cstdio>
using namespace std;

int const maxn=365000;//總狀態數不超過362880
char s[12],t[12];

//FOR DIRECTION
int num[9]={2,3,2,3,4,3,2,3,2};//指示每個位置可以移動的方向數
int dirn[9][4]=
{
    
{1,2},
    
{1,2,3},
    
{2,3},
    
{0,1,2},
    
{0,1,2,3},
    
{0,2,3},
    
{0,1},
    
{0,1,3},
    
{0,3}
}
;
//end
int xy[9][2]={{0,0},{1,0},{2,0},{0,-1},{1,-1},{2,-1},{0,-2},{1,-2},{2,-2}};//存每個位置的坐標
int fa[maxn],cz[maxn];//cz是回溯時記錄方向
int factor[8]={1,2,6,24,120,720,5040,40320};
int dist[10][10];//存第i個位置到第j個位置要走的步數
int v[maxn];//標記是否在OPEN表中
int goalcode;
int initzeropos;

struct node
{
    
int pos,g,h,code;//code is short for hashcode
    char s[12];
    
bool operator<(node o)
    
{
        
return (g+h) < (o.g+o.h);
    }

}
;


#define ele node//可以修改數據類型
struct MinHeap
{
    ele 
*h;//heap數組
    int Csize;//CurrentSize現在的容量
    int Msize;//最大容量
    void Down(int s,int e)//第s號位置的元素進行下滲,數組中最大的下標到e
    {
        
int i=s,j=2*i+1;
        ele t
=h[i];
        
while(j<=e)
        
{
            
if(j<e&&h[j+1]<h[j])
                j
++;
            
if(t<h[j])
                
break;
            
else 
            
{
                h[i]
=h[j];i=j;j=2*j+1;
            }

        }

        h[i]
=t;
    }

    
void Up(int s)//start,上滲函數
    {

        
int j=s,i=(j-1)/2;
        ele t
=h[j];
        
while(j)
        
{
            
if(h[i]<t) break;
            
else
            
{   
                h[j]
=h[i];j=i;i=(i-1)>>1;
            }

        }

        h[j]
=t;
    }

    MinHeap(
int n){Msize=n;h=new ele[Msize];Csize=0;}//構造函數
    bool Insert(const ele &x)
    
{
        
if(Csize==Msize)
            
return false;
        h[Csize]
=x;
        Up(Csize);
        Csize
++;
        
return true;
    }

    ele RemoveMin()
    
{
        
//v[h[0].code]=false;//記錄
        ele x=h[0];
        h[
0]=h[Csize-1];
        Csize
--;
        Down(
0,Csize-1);
        
return x;
    }

    ele GetMin()
{return h[0];}
}
;
MinHeap H(maxn);

int GetDist(int s,int t)//計算兩個位置之間的最小步數
{
    
int dx=abs(xy[s][0]-xy[t][0]);
    
int dy=abs(xy[s][1]-xy[t][1]);
    
return dx+dy;
}

int cal(char s[])  //計算全排列的哈希值(hashcode)
{
    
int i,j,cnt,res=0;
    
for(i=1;i<9;i++)
    
{
        cnt
=0;
        
for(j=0;j<i;j++)
            
if(s[j]>s[i])cnt++;
        cnt
*=factor[i-1];
        res
+=cnt;
    }

    
return res;
}



int estimate(char str[])
{
    
int res=0,i,des;
    
for(i=0;i<9;i++)
    
{
        
if(str[i]!='0')
        
{
            des
=str[i]-'0'-1;
            res
+=dist[i][des];
        }

    }

    
return res;
}


bool check(char s[])//檢測目標狀態是否可達
{
    
int i,j,cnt,res=0;
    
for(i=1;i<9;i++)
    
{
        cnt
=0;
        
for(j=0;j<i;j++)
            
if(s[j]>s[i])cnt++;
        res
+=cnt;
    }

    
for(i=0;i<9;i++)
    
{
        
if(s[i]=='0')
        
{
            res
+=dist[i][8];
            
break;
        }

    }

    
if((res%2)==0)
        
return true;
    
else return false;
}



int change(char s[],int op,int pos) //互換位置,返回換后的空格位置
{
    
int end;
    
if(op==0)end=pos-3;
    
else if(op==1)end=pos+1;
    
else if(op==2)end=pos+3;
    
else if(op==3)end=pos-1;
    
char t=s[pos];
    s[pos]
=s[end];
    s[end]
=t;
    
return end;//返回調整后空格的位置
}


void Astar(char s[])
{
    H.Csize
=0;//清空操作
    node t;
    t.pos
=initzeropos;
    t.g
=0;
    t.h
=estimate(s);
    t.code
=cal(s);
    strcpy(t.s,s);
    v[t.code]
=true;
    cz[t.code]
=0;
    fa[t.code]
=-1;
    H.Insert(t);
    
//以上為初始化
    while(H.Csize>0)
    
{
        node tt
=H.RemoveMin();
        
if(tt.code==goalcode)     
        
{
            
int ans[1000];
            
int k=0,fp;
            fp
=tt.code;
            
while(fp!=t.code)
            
{
                ans[k
++]=cz[fp];
                fp
=fa[fp];
            }

            
for(int i=k-1;i>=0;i--)
            
{
                
if(ans[i]==0)printf("u");
                
else if(ans[i]==1)printf("r");
                
else if(ans[i]==2)printf("d");
                
else if(ans[i]==3)printf("l");
            }

            printf(
"\n");
            
return;
        }

        
int len=num[tt.pos];
        
for(int i=0;i<len;i++)
        
{
            node x
=tt;
            x.pos
=change(x.s,dirn[tt.pos][i],x.pos);
            x.code
=cal(x.s);
            x.g
++;
            x.h
=estimate(x.s);        
            
if(!v[x.code])
            
{
                v[x.code]
=true;
                fa[x.code]
=tt.code;
                cz[x.code]
=dirn[tt.pos][i];
                H.Insert(x);
            }


        }

    }


}





int main()
{
    
int i,j;
    strcpy(t,
"123456780");
    goalcode
=cal(t);


    
for(i=0;i<9;i++)
        
for(j=0;j<9;j++)dist[i][j]=GetDist(i,j);

    
char str[50];
    
while(gets(str))
    
{
        
int len=strlen(str),pos=0;
        memset(v,
0,sizeof(v));
        
for(i=0;i<len;i++)
        
{
            
if(str[i]=='x')//空格部分用0代替
            {
                initzeropos
=pos;
                s[pos
++]='0';
            }

            
else if(str[i]>='1'&&str[i]<='8')s[pos++]=str[i];
        }

        s[
9]='\0';
        
if(!check(s))printf("unsolvable\n");
        
else Astar(s);
    }

    
return 0;
}



代碼參考了:http://m.shnenglu.com/longzxr/archive/2010/07/05/92978.html#119349

posted on 2010-07-10 15:14 abilitytao 閱讀(2207) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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级欧美特级ar全黄| 欧美日韩亚洲高清一区二区| 国产精品久久久久久久电影 | 91久久精品日日躁夜夜躁欧美| 在线精品亚洲一区二区| 日韩视频精品| 欧美一区二区视频免费观看| 免费h精品视频在线播放| 亚洲精品看片| 在线亚洲欧美专区二区| 久久久国产精品一区| 欧美高清视频在线| 国产精品视频久久一区| 亚洲人成高清| 欧美一区视频在线| 亚洲娇小video精品| 亚洲欧美日本国产专区一区| 免费不卡在线观看| 国产精品一区二区久久精品| 亚洲国产综合视频在线观看| 午夜视频一区在线观看| 亚洲国产va精品久久久不卡综合| 亚洲欧美激情四射在线日| 欧美大片在线观看一区二区| 欧美在线高清| 日韩视频在线免费观看| 欧美一区二区三区的| 免费成人性网站| 国产亚洲综合精品| 亚洲一区成人| 亚洲人www| 久久综合影视| 国产欧美婷婷中文| 亚洲一区二区三区精品在线| 亚洲国产成人av| 久久久精彩视频| 国产日韩欧美视频在线| 亚洲永久精品大片| 亚洲精品国产精品国自产在线| 久久久精品2019中文字幕神马| 99综合视频| 欧美日韩亚洲成人| 一区二区三区欧美视频| 亚洲电影网站| 美女主播视频一区| 亚洲国产成人91精品| 老牛影视一区二区三区| 午夜亚洲精品| 国产深夜精品| 久久综合精品一区| 老司机免费视频久久| 亚洲电影免费| 欧美大片va欧美在线播放| 久久久久久一区二区三区| 国产视频久久| 久久久久久亚洲精品不卡4k岛国| 亚洲一区二区三区四区五区午夜| 国产精品久久久久av| 亚洲欧美999| 亚洲男人第一网站| 国产一区二区三区精品久久久| 欧美中文字幕不卡| 久久久久久久999| 亚洲电影自拍| 一区二区激情小说| 在线视频欧美日韩| 国产精品乱人伦中文| 欧美一区三区二区在线观看| 欧美在线高清| 国产综合欧美| 免费久久精品视频| 欧美激情视频在线播放| 亚洲视频一区二区| 欧美亚洲综合久久| 91久久国产精品91久久性色| 亚洲人www| 国产裸体写真av一区二区| 久久精品国产清自在天天线| 久久久最新网址| 国产精品99久久久久久久vr | 性欧美精品高清| 欧美在线不卡| 欧美一区二区高清| 一区二区三区欧美激情| 亚洲黄色视屏| 国产精品日韩精品欧美精品| 美女诱惑一区| 欧美视频在线一区二区三区| 久久久久久久久久久成人| 欧美精品大片| 久久艳片www.17c.com| 欧美人与禽猛交乱配| 欧美在线视频一区二区三区| 久久综合久色欧美综合狠狠| 亚洲欧美日韩一区二区在线| 久久亚洲欧美| 午夜精品久久久久久久久| 久久综合久久综合久久| 欧美在线日韩精品| 欧美精品在线视频| 美国成人毛片| 国产老女人精品毛片久久| 亚洲国产欧美一区二区三区同亚洲 | 亚洲精品美女久久久久| 亚洲综合成人婷婷小说| 一区二区久久久久| 欧美sm视频| 欧美成ee人免费视频| 国产一区二区精品久久99| 亚洲私人黄色宅男| 一区二区高清| 欧美女人交a| 亚洲国产福利在线| 91久久国产精品91久久性色| 久久一区亚洲| 久久综合国产精品台湾中文娱乐网| 国产精品自拍网站| 亚洲一区二区三区中文字幕| 亚洲一区久久| 欧美日韩国产专区| 91久久在线| 一区二区三区视频免费在线观看| 欧美国产精品劲爆| 91久久精品美女高潮| 99re热精品| 欧美日韩成人在线| 日韩一级大片| 性做久久久久久久免费看| 国产精品久久午夜| 亚洲嫩草精品久久| 久久久国产精品一区二区三区| 国产亚洲午夜| 久久精品91| 欧美韩国一区| av成人老司机| 欧美无砖砖区免费| 亚洲一区免费看| 久久精品五月婷婷| 伊人久久婷婷| 欧美激情在线免费观看| 在线一区二区视频| 久久se精品一区精品二区| 国产一区二区看久久| 久久综合色8888| 99精品国产一区二区青青牛奶 | 欧美交受高潮1| 亚洲国产色一区| 亚洲一区二区三区四区视频 | 欧美日产国产成人免费图片| 99精品国产在热久久| 欧美一区激情视频在线观看| 樱桃国产成人精品视频| 欧美国产精品中文字幕| 夜夜嗨av色综合久久久综合网 | 欧美亚洲一区二区在线| 国内精品久久国产| 欧美精品免费播放| 亚洲女ⅴideoshd黑人| 欧美高清视频免费观看| 亚洲免费网站| 亚洲国产小视频在线观看| 欧美日一区二区在线观看 | 欧美绝品在线观看成人午夜影视| 在线一区二区视频| 欧美激情国产高清| 欧美一区二区三区男人的天堂 | 国产精品综合av一区二区国产馆| 久久精品国产77777蜜臀| 亚洲精品三级| 你懂的一区二区| 欧美一区亚洲| 一区二区三区四区五区精品视频| 国内精品久久久久影院优| 欧美日韩综合精品| 欧美不卡高清| 久久久精品国产一区二区三区 | 欧美福利一区| 欧美在线一级视频| 亚洲最新在线| 亚洲国产精品99久久久久久久久| 国产精品一区二区久久久| 欧美日韩1区| 欧美福利视频一区| 久久久噜噜噜久久中文字免| 在线视频亚洲欧美| 亚洲精品视频一区| 欧美国产日韩a欧美在线观看| 久久精品国产一区二区三| 亚洲女爱视频在线| 亚洲一区日韩| 亚洲综合好骚| 亚洲在线日韩|