題意:就是說,給出乙個三行三列的陣列,其中元素為1--8和x,例如:
1 2 3 現在,需要你把它變成:1 2 3 要的最少步數的移動方案。可以右移r,左移l,上移u,下移d有的人說,廣搜不能記錄路徑?這是錯誤的,廣搜只要你清楚的記錄這個狀態的上個狀態是什麼,那麼就可以記錄路徑,很明顯只需要開個記錄路徑的搜尋就ok了x 4 6 4 5 6
7 5 8 7 8 x
**:
#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 即可,從結果出發,每操作一次,儲存一次該...