八數(shù)碼

八數(shù)碼胆筒,BFS模板題皂贩,不做人生不完整

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int maxn = 1000000;

typedef int State[9];

State que[maxn];
State goal;
int dist[maxn];

int vis[362880],fact[9]; 
void init_lookup_table(){
    fact[0]=1;
    for(int i=1;i<9;i++) fact[i]=fact[i-1]*i;
}
//康托展開 
int try_to_insert(int s){
    int code=0;
    for(int i=0;i<9;i++){
        int cnt=0;
        for(int j=i+1;j<9;j++)  if(que[s][i]>que[s][j]) cnt++;
        code+=fact[8-i]*cnt;
    }
    if(vis[code]) return 0;
    return vis[code]=1;
}

const int dx[] = {0,0,1,-1};
const int dy[] = {1,-1,0,0};
int bfs(){
    init_lookup_table();
    int front = 1, rear = 2;
    while(front!=rear){
        State& s = que[front];
        if(memcmp(s,goal,sizeof(goal))==0) return front;
        int z;
        for(z=0;z<9;z++) if(!s[z]) break;
        int x = z%3, y = z/3;
        for(int i=0;i<4;i++){
            int newx = x+dx[i];
            int newy = y+dy[i];
            int newz = newy*3+newx;
            if(newx>=0 && newx<3 && newy>=0 && newy<3){
                State& t = que[rear];
                memcpy(&t, &s, sizeof(s));
                t[newz] = s[z];
                t[z] = s[newz];
                dist[rear] = dist[front]+1;
                if(try_to_insert(rear)) rear++;
            }
        }
        front++;
    }
    return 0;
}
int main(){
    for(int i=0;i<9;i++)  scanf("%d", &que[1][i]);
    for(int i=0;i<9;i++)  scanf("%d", &goal[i]);
    int ans = bfs();
    if(ans>0) printf("%d\n",dist[ans]);
    else printf("-1\n");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末物蝙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姑隅,更是在濱河造成了極大的恐慌莱坎,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糙箍,死亡現(xiàn)場離奇詭異渤愁,居然都是意外死亡,警方通過查閱死者的電腦和手機深夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門抖格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咕晋,你說我怎么就攤上這事雹拄。” “怎么了掌呜?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵滓玖,是天一觀的道長。 經(jīng)常有香客問我质蕉,道長势篡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任模暗,我火速辦了婚禮禁悠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兑宇。我一直安慰自己碍侦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布隶糕。 她就那樣靜靜地躺著祝钢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪若厚。 梳的紋絲不亂的頭發(fā)上拦英,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音测秸,去河邊找鬼疤估。 笑死灾常,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铃拇。 我是一名探鬼主播钞瀑,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慷荔!你這毒婦竟也來了雕什?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤显晶,失蹤者是張志新(化名)和其女友劉穎贷岸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磷雇,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡偿警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唯笙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟蒸。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖崩掘,靈堂內(nèi)的尸體忽然破棺而出七嫌,到底是詐尸還是另有隱情,我是刑警寧澤苞慢,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布抄瑟,位于F島的核電站,受9級特大地震影響枉疼,放射性物質(zhì)發(fā)生泄漏皮假。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一骂维、第九天 我趴在偏房一處隱蔽的房頂上張望惹资。 院中可真熱鬧,春花似錦航闺、人聲如沸褪测。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侮措。三九已至,卻和暖如春乖杠,著一層夾襖步出監(jiān)牢的瞬間分扎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工胧洒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畏吓,地道東北人墨状。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像菲饼,于是被迫代替她去往敵國和親肾砂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 八數(shù)碼問題也稱為九宮問題宏悦。在3×3的棋盤镐确,擺有八個棋子,每個棋子上標(biāo)有1至8的某一數(shù)字饼煞,不同棋子上標(biāo)的數(shù)字不相同源葫。...
    聽城閱讀 9,523評論 0 1
  • 歡迎關(guān)注我的公眾號:讀書主義 更多精彩等著你! 這個讀書方法派哲,可能會顛覆你對讀書以往的認(rèn)知|開卷 或許讀書已經(jīng)成為...
    米米粒粒閱讀 34,537評論 9 209
  • 看一看
    小朋友喜歡堆雪人閱讀 95評論 0 0
  • 我是個崇尚自由的人臼氨,因而我的人生信條是掺喻,追求自由芭届,堅持本心。 從高中時候就特別喜歡莊子感耙,被那種以自由為情懷的...
    敏敏妮閱讀 240評論 0 0
  • 耳邊已經(jīng)聽不見喧囂的都市聲音即硼,心跟著手中的鍵盤滴答跳動逃片,一下兩下.... 以前借閱朋友的那本大冰作品《阿彌陀福,么...
    肉都給我吃閱讀 218評論 15 0