題意:給定乙個現有的九宮格布局,請輸出將它移動至初始狀態的移動方法的步驟。
思路:自己沒什麼思路。學了康拓展開,看了別人的部落格才理解了,暫且先放著別人的**,,等自己實力足夠了再自己寫試試
//hdu1043-經典bfs-八數碼
//多組資料-需要計算全部路徑後直接輸出(poj1077資料較弱)
//反向搜尋+打表(離線)
//time:109ms memory:25412k
#include#include#include#includeusing namespace std;
#define max 400000
#define aim 46234 //123456780對應的康托hash值
bool v[max];
char path[max][40]; //總路徑
int len; //路徑長
/*udlr*/
char *dir = "durl"; //反向搜尋
int mov[4][2] = , , , };
//八數碼狀態結構體
struct noden[max];
int fac[10] = ;
//康托逆展開-返回hash值
int inverse_cantor(int s[9])
return sum + 1;
}/*反向記錄路徑*/
void count_path(node end)
}void bfs()
}head++;
}}int main()
cur.status = inverse_cantor(cur.s);
/*output*/
if (v[cur.status])
printf("%s\n", path[cur.status]);
else
printf("unsolvable\n");
}return 0;
}
BFS拓展 康拓展開
原諒我我實在不想粘題目了 這道題吧,本來不想加進來的。其實就是對於八數碼問題的乙個補充,上面可愛的出題人已經將康拓展開講的很清楚了。照著敲就行。include using namespace std typedef long long ll inline ll read const ll maxn ...
HDU 1043 八數碼問題 雙向BFS
題目鏈結 題意 給你乙個初始狀態,問你能否移動到最終的完成狀態,如果能輸出任意一組解,否則輸出unsolved。思路 乍一看是個bfs,但是狀態過多會tle或者mle,但是除可bfs確實沒得寫了,這時候就要用到雙向bfs了,起點終點同時bfs,判斷相遇,路徑用string 就行了。注意點 正向路徑s...
HDU 1043 Eight(康托展開 BFS)
八數碼問題,輸入9個字元代表乙個3 3的棋盤,對於能還原的輸入,輸出一段包含 u d l r 操作的操作序列,不能還原的輸入輸出 unsolvable 輸入有多組,所以考慮先預處理出所有情況的操作序列,再根據輸入進行輸出 因為要遍歷所有情況,所以選擇 bfs 即可,從結果出發,每操作一次,儲存一次該...