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

pku 1077

2009年8月11日 星期二

題目鏈接:PKU 1077 Eight  

分類:bfs,雙向bfs,A*

題目分析與算法原型
         這道題目是前一陣子做的,一直沒有寫解題報(bào)告,主要是想找個(gè)時(shí)間好好的總結(jié)一下這道題,因?yàn)閺倪@道題中收獲了很多東西,比方說A*的大體思想,如何設(shè)計(jì)啟發(fā)式函數(shù)使得其滿足A*算法的約束性,還有就是全排列哈希的方式(不存在沖突),以及堆優(yōu)化時(shí)遇到已經(jīng)標(biāo)記過的但是當(dāng)前值更小的情況下如何去更新而不是再次插入(以前的時(shí)候我一直都采用的是再次插入,這樣子空間的復(fù)雜度高起來了)等等........總的來說收獲很多,所有需要好好地記錄一下
        關(guān)于此題的A*解法(當(dāng)然bfs或雙向bfs也可以解決),8數(shù)碼問題經(jīng)典的啟發(fā)式函數(shù)有兩種:比較簡單的是difference ( Status a,  Status b ), 其返回值是a 和b狀態(tài)各位置上數(shù)字(空格除外)不同的次數(shù)。另一種比較經(jīng)典的是曼哈頓距離   manhattan ( Status a, Status b ),其返回的是各個(gè)數(shù)字(除卻空格)從a的位置到b的位置的最短距離的和。學(xué)過A*的都應(yīng)該知道,若想設(shè)計(jì)的A*算法能夠保證找到最優(yōu)解,其啟發(fā)式函數(shù)(f(n)=g(n)+h(n) ,其中f(n) 是節(jié)點(diǎn)n的估價(jià)函數(shù),g(n)實(shí)在狀態(tài)空間中從初始節(jié)點(diǎn)到n節(jié)點(diǎn)的實(shí)際代價(jià),h(n)是從n到目 標(biāo)節(jié)點(diǎn)最佳路徑的估計(jì)代價(jià)
)必須滿足兩點(diǎn):1.h(n)<h'(n),h'(n)為從當(dāng)前節(jié)點(diǎn)到目標(biāo)點(diǎn)的實(shí)際的最優(yōu)代價(jià)值。2.每次擴(kuò)展的節(jié)點(diǎn)的f值至少不比父節(jié)點(diǎn)的f值小。
       我們先來看第一個(gè)啟發(fā)函數(shù),即difference,容易看出此時(shí)第一個(gè)條件顯然滿足,關(guān)于第二個(gè)條件,g( n)以為搜索的深度,所以子節(jié)點(diǎn)的g比父節(jié)點(diǎn)的g大1,然而,每次將空白位置與周圍的某個(gè)數(shù)字交換后(不算空格),對于交換的這個(gè)數(shù)字,有兩種結(jié)果,I.其和目標(biāo)的位置相同。II.和目標(biāo)的位置不同,即就是說h最多減少1,或者不變,所以g+h要么不變,要么比原先大1,此時(shí)兩個(gè)條件都滿足,因此該啟發(fā)式函數(shù)能保證找到最優(yōu)解。
        再看第二個(gè)啟發(fā)式函數(shù),即 manhattan ,也容易看出其定符合第一個(gè)條件,對于第二個(gè)條件,因?yàn)椴凰憧崭?,所以每次交換我們只考慮和空格交換的那個(gè)數(shù)字,可以發(fā)現(xiàn)那個(gè)數(shù)字最多離目標(biāo)位置前進(jìn)一個(gè)(或者不變,或者后退一個(gè)),也就是說h之多減少1個(gè),然而g已經(jīng)加了1,所以g+h至少和原來的相等,或者更大,這樣一來,第二個(gè)條件也滿足了,由此我們可以發(fā)現(xiàn),這兩個(gè)啟發(fā)式函數(shù)都可以保證A*找到最優(yōu)解(關(guān)于為什么滿足了A*的這兩個(gè)條件就一定保證能找到最優(yōu)解,可以去參考一下相應(yīng)的人工智能的書籍,里面有詳細(xì)的證明)
        還有關(guān)于這道題的判重可采用全排列之哈希方式(點(diǎn)此鏈接)..........
         (PS:說起這道題,不得不提一件事,那就是我在寫的時(shí)候?qū)?#8220;des=now[i]-'0'-1;”不小心寫成了“des=now[i]-1”,拜托,兩個(gè)值整整差了48啊,而且我是將他作為D數(shù)組的一個(gè)下標(biāo),我的D數(shù)組才定義了D[10][10],這樣你會發(fā)現(xiàn)顯然已經(jīng)數(shù)組越界了,然后神奇的事情居然就發(fā)生了,這樣子居然........AC了!!!!!!!!!,orz............真不知道是不是偶的RP太好了,這樣子能A掉,想想很不可思議,也正因?yàn)槿绱?,使得我的程序?dāng)時(shí)出現(xiàn)了一個(gè)異常詭異的地方,這個(gè)詭異的地方說起來有點(diǎn)麻煩就不多說了,反正我一直都沒找出是怎么回事,后來才發(fā)現(xiàn)這個(gè)致命的筆誤,再次膜拜自己,居然這樣子都能過,狂暈啊,RP太好了點(diǎn)吧.........,而且改這個(gè)錯(cuò)誤之前的程序跑的是150ms左右,改了后就能跑到0ms了,很想不通,這個(gè)錯(cuò)誤居然還能影響時(shí)間........orz.......orz........orz..........
           總結(jié):RP的力量果然很強(qiáng)大,所以偶們都需要好好積攢RP,適當(dāng)?shù)臅r(shí)候說不定能創(chuàng)造奇跡.........)

Code:

  1
#include<stdio.h>
  2#include<string.h>
  3#include<math.h>
  4#include<time.h>
  5#include<stdlib.h>
  6#define max 365000
  7
  8char beg[12],end[12],pace[9][5]={"dr","dlr","dl","udr","udlr","udl","ur","ulr","ul"},cz[max],ss[50];
  9int count,pp,mincost[max],fm[max],place[max],jc[8]={1,2,6,24,120,720,5040,40320},D[10][10];
 10int a[9][2]={{0,0},{1,0},{2,0},{0,-1},{1,-1},{2,-1},{0,-2},{1,-2},{2,-2}},goal;
 11bool flag[max];
 12
 13struct node
 14{
 15    int pos,g,h,num;
 16    char s[10];
 17}
queue[max];
 18void down_min_heap(int n,int h)//n表示堆元素的個(gè)數(shù),從0開始編號,從h開始往下調(diào)整
 19{
 20    int i=h,j=2*i+1;
 21    node temp=queue[i];
 22    while(j<n)
 23    {
 24        if(j<n-1&&queue[j].g+queue[j].h>queue[j+1].g+queue[j+1].h)j++;//若右孩子存在,且右孩子比較小,取右
 25        if(temp.g+temp.h<queue[j].g+queue[j].h)break;
 26        else
 27        {
 28            place[queue[j].num]=i;
 29            queue[i]=queue[j];
 30            i=j;
 31            j=2*i+1;
 32        }

 33    }

 34    queue[i]=temp;
 35    place[temp.num]=i;
 36}

 37void up_min_heap(int s)
 38{
 39    while (s>0&&queue[s].g+queue[s].h<queue[(s-1)/2].g+queue[(s-1)/2].h)     //從s開始往上調(diào)整
 40    
 41        place[queue[s].num]=(s-1)/2;
 42        place[queue[(s-1)/2].num]=s;
 43        node tt=queue[s];
 44        queue[s]=queue[(s-1)/2];
 45        queue[(s-1)/2]=tt;
 46        s=(s-1)/2
 47    }

 48}

 49node pop()
 50{
 51    node res=queue[0];
 52    queue[0]=queue[count-1];
 53    place[queue[count-1].num]=0;
 54    count--;
 55    down_min_heap(count,0);
 56    return res;
 57}

 58void push(node x)
 59{
 60    queue[count]=x;
 61    place[x.num]=count;
 62    count++;
 63    up_min_heap(count-1);
 64}

 65int cal(char s[])  //計(jì)算全排列的哈希值(唯一對應(yīng))
 66{
 67    int i,j,cnt,res=0;
 68    for(i=1;i<9;i++)
 69    {
 70        cnt=0;
 71        for(j=0;j<i;j++)if(s[j]>s[i])cnt++;
 72        cnt*=jc[i-1];
 73        res+=cnt;
 74    }

 75    return res;
 76}

 77int dist(int now ,int des)//計(jì)算兩個(gè)位置之間的最小步數(shù)
 78{
 79    int px=(int)(fabs(a[now][0]-a[des][0])),py=(int)(fabs(a[now][1]-a[des][1]));
 80    return px+py;
 81}

 82
 83//啟發(fā)函數(shù)采用曼哈頓距離,即從當(dāng)前狀態(tài)下的每個(gè)數(shù)字(空格除開),分別到目標(biāo)狀態(tài)下相應(yīng)數(shù)字的最小步數(shù)之和
 84
 85int estimate(char now[])
 86{
 87    int res=0,i,des;
 88    for(i=0;i<9;i++)
 89    {
 90        if(now[i]!='0')
 91        {
 92            des=now[i]-'0'-1;
 93            res+=D[i][des];
 94        }

 95    }

 96    return res;
 97}

 98int change(char s[],char op,int pos) //互換位置,返回?fù)Q后的空格位置
 99{
100    int end;
101    switch(op)
102    {
103    case 'u':end=pos-3;break;
104    case 'd':end=pos+3;break;
105    case 'l':end=pos-1;break;
106    case 'r':end=pos+1;break;
107    }

108    char mid=s[pos];
109    s[pos]=s[end];
110    s[end]=mid;
111    return end;///返回調(diào)整后空格的位置
112}

113void bfs(char beg[],char end[])
114{
115    int i,num;
116    queue[0].pos=pp;
117    queue[0].g=0;
118    queue[0].h=estimate(beg);
119    num=cal(beg);
120    queue[0].num=num;
121    strcpy(queue[0].s,beg);
122    count=1;
123
124    flag[num]=true;
125    cz[num]='*';
126    fm[num]=-1;
127    place[num]=0;
128    mincost[num]=queue[0].h;
129    while(count>0)
130    {
131        node tt=pop();
132        place[tt.num]=count;
133        if(tt.num==goal)     
134        {
135            char ans[1000];
136            int k=0,fp;
137            fp=tt.num;
138            while(fp!=num)
139            {
140                ans[k++]=cz[fp];
141                fp=fm[fp];
142            }

143            int jj;
144            for(jj=k-1;jj>=0;jj--)printf("%c",ans[jj]);
145            printf("\n");
146            return;
147        }

148        int len=strlen(pace[tt.pos]);
149        for(i=0;i<len;i++)
150        {
151            node x=tt;
152            x.pos=change(x.s,pace[tt.pos][i],x.pos);
153            int k=cal(x.s);
154            x.num=k;
155            x.g++;
156            x.h=estimate(x.s);        
157            if(!flag[k])
158            {
159                flag[k]=true;
160                mincost[k]=x.g+x.h;
161                fm[k]=tt.num;
162                cz[k]=pace[tt.pos][i];
163                push(x);
164            }

165            else if(flag[k]&&x.g+x.h<mincost[k])
166            {
167                mincost[k]=x.g+x.h;
168                fm[k]=tt.num;
169                cz[k]=pace[tt.pos][i];
170                queue[place[k]]=x;
171                up_min_heap(place[k]);
172            }

173        }

174    }

175}

176bool check(char beg[])//檢測目標(biāo)狀態(tài)是否可達(dá)
177{
178    int i,j,cnt,res=0;
179    for(i=1;i<9;i++)
180    {
181        cnt=0;
182        for(j=0;j<i;j++)if(beg[j]>beg[i])cnt++;
183        res+=cnt;
184    }

185    for(i=0;i<9;i++)
186    {
187        if(beg[i]=='0')
188        {
189            res+=D[i][8];
190            break;
191        }

192    }

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

196int  main()
197{
198    int i,j;
199    strcpy(end,"123456780");
200    goal=cal(end);
201
202    for(i=0;i<9;i++)
203        for(j=0;j<9;j++)D[i][j]=dist(i,j);
204    while(gets(ss))
205    {
206        int len=strlen(ss),pos=0;
207        memset(flag,false,sizeof(flag));
208        for(i=0;i<len;i++)
209        {
210            if(ss[i]=='x')//空格部分用0代替
211            {
212                pp=pos;
213                beg[pos++]='0';
214            }

215            else if(ss[i]>='1'&&ss[i]<='8')beg[pos++]=ss[i];
216        }

217        beg[9]='\0';
218        if(!check(beg))printf("unsolvable\n");
219        else bfs(beg,end);
220    }

221    return 1;
222}

223

posted on 2009-08-12 00:00 蝸牛也Coding 閱讀(2595) 評論(4)  編輯 收藏 引用

評論

# re: pku 1077 2009-08-12 11:59 12530彩鈴

不錯(cuò)啊~  回復(fù)  更多評論   

# re: pku 1077 2009-08-13 02:02 abilitytao

你好像對搜索情有獨(dú)鐘 呵呵   回復(fù)  更多評論   

# re: pku 1077 2009-08-13 09:39 蝸牛也Coding

@abilitytao
呵呵,只是最近一陣子在做搜索方面的題目而已.......  回復(fù)  更多評論   

# re: pku 1077 2010-07-05 14:48 tt

今天在研究你的代碼 但是還有一些地方不太明白 不知道能否和你交流一下 我的QQ是64076241  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(8)

隨筆檔案(78)

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产亚洲综合精品| 欧美精品九九99久久| 欧美韩日高清| 欧美好吊妞视频| 亚洲大片在线观看| 亚洲国产成人久久| 91久久在线视频| 亚洲视频在线视频| 久久精品亚洲精品| 亚洲一级高清| 久久久久久久久久久久久9999| 久久精品视频99| 美女国产精品| 国产精品免费一区二区三区在线观看 | 亚洲大片av| 亚洲精品久久久久久一区二区| 亚洲精品在线一区二区| 99人久久精品视频最新地址| 亚洲视频香蕉人妖| 久久久久久久久久久久久女国产乱 | 国产欧美日韩不卡| 在线观看视频一区二区欧美日韩| 亚洲精品久久久久久下一站| 亚洲综合二区| 欧美国产精品中文字幕| 在线一区二区视频| 久久久久久久波多野高潮日日 | 欧美精品videossex性护士| 欧美视频在线看| 国产日韩亚洲| 中文在线资源观看网站视频免费不卡 | 久久夜色精品国产欧美乱极品| 欧美成人69av| 国产欧美一区二区视频| 91久久精品国产91久久性色tv| 午夜视频在线观看一区| 欧美国内亚洲| 久久精品免视看| 国产欧美日韩一区二区三区| 在线一区二区三区四区| 欧美sm视频| 欧美亚洲系列| 国产精品欧美日韩一区| 亚洲精品欧美专区| 免费一级欧美片在线播放| 亚洲网友自拍| 国产精品久久久久久超碰| 亚洲美女视频在线观看| 蜜臀91精品一区二区三区| 欧美一区二区三区免费观看| 国产精品久久国产精品99gif | 亚洲久久一区二区| 亚洲毛片网站| 老司机免费视频久久| 亚洲一区二区精品视频| 欧美大尺度在线| 亚洲国产毛片完整版| 久久久中精品2020中文| 亚洲综合精品四区| 国产精品高清一区二区三区| 亚洲精品美女在线观看| 久久夜色精品国产亚洲aⅴ| 亚洲欧美日韩国产| 国产精品视频免费| 亚洲综合首页| 国产欧美日韩视频在线观看| 午夜在线电影亚洲一区| 中文日韩在线| 国产精品一区三区| 新67194成人永久网站| 亚洲一区在线免费观看| 国产精品日韩高清| 欧美一级艳片视频免费观看| 亚洲视频一二| 国产精品一区二区久久久久| 亚洲欧美日韩天堂| 亚洲欧美综合一区| 国产欧美一级| 欧美**字幕| 欧美激情性爽国产精品17p| 在线综合亚洲| 欧美中在线观看| 亚洲人成人99网站| 亚洲免费大片| 国产婷婷色一区二区三区在线| 久久久久综合网| 欧美a一区二区| 午夜日韩在线| 久久综合网络一区二区| aa级大片欧美三级| 亚洲欧美日韩爽爽影院| **网站欧美大片在线观看| 亚洲国语精品自产拍在线观看| 欧美精品福利视频| 久久成人资源| 欧美黑人国产人伦爽爽爽| 性伦欧美刺激片在线观看| 久久裸体视频| 亚洲欧美三级在线| 久久激情视频久久| 中国成人亚色综合网站| 久久丁香综合五月国产三级网站| 99riav国产精品| 久久久噜噜噜| 午夜精品理论片| 欧美成人免费大片| 久久精品国产99国产精品澳门| 蜜月aⅴ免费一区二区三区| 亚洲免费在线观看视频| 亚洲欧美另类国产| 免费观看亚洲视频大全| 欧美制服丝袜第一页| 欧美激情第二页| 免费观看一区| 国产日韩欧美在线播放不卡| 99精品视频免费全部在线| 一区在线免费| 欧美在线看片a免费观看| 亚洲一区国产| 欧美成人四级电影| 狼狼综合久久久久综合网| 欧美亚洲成人免费| 亚洲国产天堂久久综合| 国产亚洲网站| 欧美一区二区女人| 欧美一区二区三区四区高清| 欧美日韩国产精品| 亚洲国产日韩一区| 亚洲国产毛片完整版| 久久精品日韩一区二区三区| 欧美一区二区在线视频| 国产精品国产三级国产aⅴ浪潮 | 久久中文久久字幕| 久久精品国产清高在天天线| 欧美性开放视频| 日韩亚洲欧美成人| 亚洲性视频网址| 欧美网站在线观看| 宅男在线国产精品| 亚洲一区二区四区| 欧美三级网址| 亚洲午夜电影网| 欧美一级大片在线免费观看| 国产精品一区免费在线观看| 亚洲欧美日韩视频一区| 欧美在线啊v| 韩日成人在线| 欧美xxxx在线观看| 亚洲国产合集| aa日韩免费精品视频一| 国产精品国产三级国产普通话99 | 亚洲三级国产| 亚洲婷婷综合久久一本伊一区| 欧美精品亚洲一区二区在线播放| 亚洲人成网在线播放| 亚洲欧美国产另类| 国产亚洲在线| 蜜臀a∨国产成人精品| 亚洲福利小视频| 一区二区欧美激情| 国产欧美精品在线播放| 久久久久久久久久久成人| 亚洲国产一区二区三区a毛片| 亚洲一区二区三区免费在线观看 | 国产综合婷婷| 欧美大片一区二区| 一本色道久久综合精品竹菊| 欧美一区综合| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲欧洲一区二区三区在线观看| 欧美激情欧美狂野欧美精品| 一区二区三区偷拍| 久久久久国产精品厨房| 亚洲国产婷婷| 国产精品视频久久久| 巨乳诱惑日韩免费av| 一区二区三区四区国产| 久久一区中文字幕| 亚洲中字在线| 亚洲人成艺术| 国产亚洲观看| 欧美区亚洲区| 老牛嫩草一区二区三区日本| 日韩亚洲欧美一区| 久久夜色精品一区| 午夜精品一区二区三区在线播放| 一区国产精品| 国产亚洲精品成人av久久ww| 欧美日韩精品欧美日韩精品一| 久久久久久久综合| 亚洲欧美日韩视频一区| 91久久久久久久久| 美女国内精品自产拍在线播放| 午夜精品福利视频| 亚洲人成亚洲人成在线观看| 国产日产高清欧美一区二区三区| 欧美四级在线观看| 欧美日韩高清不卡| 欧美黄色一级视频| 欧美成人免费全部|