poj1077 康托展開 bfs 記憶路徑

2021-09-06 13:00:59 字數 1090 閱讀 4683

題意:就是說,給出乙個三行三列的陣列,其中元素為1--8和x,例如:

1  2  3    現在,需要你把它變成:1  2  3      要的最少步數的移動方案。可以右移r,左移l,上移u,下移d

x 4 6 4 5 6

7 5 8 7 8 x

有的人說,廣搜不能記錄路徑?這是錯誤的,廣搜只要你清楚的記錄這個狀態的上個狀態是什麼,那麼就可以記錄路徑,很明顯只需要開個記錄路徑的搜尋就ok了

**:

#include#include#include#includeusing namespace std;

int t[10]= ;

char ff[400000];

struct node

;struct node1 //記錄路徑

s[362883];

int deal(char str) //康托展開

return ans1;

}int flag=0;

void bfs(char str)}}

}}

if(x>=0&&x<3&&y>=0&&y<3&&(x*3+y)<=8)}}

}}

}}int main()

; for(int i=0; i<362883; i++)

//printf("%d\n",flag);

bfs(str);

char ss[10][10];

char tt[10];

scanf("%s",ss[0]);

tt[9]='\0';

//puts(tt);

int ans=deal(tt);

int cnt=0;

flag=0;

while(ans!=0) //回溯路徑

}int i=0;

if(flag==0)

else printf("unsolvable");

printf("\n");

}return 0;

}

POJ1077 Eight A 康托展開

題目大意 乙個3 3的棋盤上有8個格仔寫著1 8的數字,還有乙個空格,給定局面,要求給出乙個空格的移動序列,使得達到目標狀態 1 2 3 4 5 6 7 8 x 空格 做法 大名鼎鼎的八數碼問題.學習了a 演算法後,今天特意去試做了了下,居然過了,資料好水啊.題目中的狀態可以用0 8的全排列表示,可...

loj 1165 bfs 康托展開)

思路 題目意思很簡單,就是通過一些位置的交換,最後變成有序數列,對於一組序列,我們可以用康托展開然後hash判重。然後就是普通的bfs,稍微留意一下細節即可。1 include2 include3 include4 include5 include6 using namespace std 7int...

HDU 1043 Eight(康托展開 BFS)

八數碼問題,輸入9個字元代表乙個3 3的棋盤,對於能還原的輸入,輸出一段包含 u d l r 操作的操作序列,不能還原的輸入輸出 unsolvable 輸入有多組,所以考慮先預處理出所有情況的操作序列,再根據輸入進行輸出 因為要遍歷所有情況,所以選擇 bfs 即可,從結果出發,每操作一次,儲存一次該...