八數碼問題使用HashTable優化查詢後的版本

2021-06-04 07:13:40 字數 3125 閱讀 1088

在《雙向廣度優先搜尋演算法框架及八數碼問題例程》一文中,給出了使用雙向廣度優先搜尋演算法解決八數碼問題的乙個

簡單版本,查詢都是線性的,沒有優化。這裡給出使用hashtable優化後的版本!

/** author: puresky

* date: 2010.01.12

* purpose: solve eigth number problem!*/

#include

#include

#include

#define maxn 10000

#define swap(a, b)

typedef struct _node node;

struct _node;

int head[2], tail[2];

node queue[2][maxn];// two queues for double directoin bfs

//shift of moving up, down, left ,right

int shift[4][2] = , , , };

//for output direction!

char dir[4][2] = , , , };

//test case

char start[10] = "23415x768";

char end[10] = "12345678x";

/****************==hash table start****************************************=*/

#define hash_table_max_size 10000

typedef struct hashnode_struct hashnode;

struct hashnode_struct;

hashnode* ht[2][hash_table_max_size];//hash table data strcutrue

//initialize hash table

void hash_table_init(hashnode *hashtable)

//string hash function

unsigned int hash_table_hash_str(const char* skey)

return h;}

//insert key-value into hash table

void hash_table_insert(hashnode *hashtable, char* skey, int nvalue)

phead = phead->pnext;}

hashnode* pnewnode = (hashnode*)malloc(sizeof(hashnode));

memset(pnewnode, 0, sizeof(hashnode));

pnewnode->skey = skey;

pnewnode->nvalue = nvalue;

pnewnode->pnext = hashtable[pos];

hashtable[pos] = pnewnode; }

//lookup a key in the hash table

hashnode* hash_table_lookup(hashnode *hashtable, const char* skey)

}return null;}

//free the memory of the hash table

void hash_table_release(hashnode *hashtable) }

}}}

/* ******************************=hash table end**************************/

//read a tile 3 by 3

void readtile()

start[9] = '\0';}

//print result

void print_backward(int i)

}void print_forward(int j)

}void print_result(int i, int j)

//init the queue

void init(int qi, const char* state)

//check if there are duplicates in the queue

//time comlexity:o(n)

//we can optimise this function using hashtable

int isduplicate(int qi)

return 0;}

//check if the current node is in another queue!

//time comlexity:o(n)

//we can optimise this function using hashtable

int isintersect(int qi)

return -1;}

//expand nodes

int expand(int qi)

else

else

return 1;

}hash_table_insert(ht[qi], pnew->tile, tail[qi]);}}

}return 0;}

//call expand to generate queues

int solve()

else

}while(head[0] <= tail[0]) if(expand(0)) return 1;

while(head[1] <= tail[1]) if(expand(1)) return 1;

return 0;}

int main(int argc, char** argv)

hash_table_release(ht[0]);

hash_table_release(ht[1]);

//system("pause"); //pause

return 0;}

acm pku judge online: 940k 記憶體,32ms 時間

八數碼問題

八數碼問題 一.八數碼問題 八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟...

八數碼問題

2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 樣例輸出 還有就是重判的問題,如何重判呢?第一種方法 把排列變成整數,然後只開乙個一維陣列,也就是說設計一套排列的編碼和解碼函式,把0 8的全排列和0 362879的整數意義一一對應起來。時間效率高,但編碼解碼法適用範圍並不大,...

八數碼問題

八數碼問題 題意 編號為1 8的8個正方形滑塊被擺成3行3列 有乙個格仔留空 如下圖所示 每次可以把與空格相鄰的滑塊 有公共邊才算相鄰 移到空格中,而他原來的位置 就成為了新的空格。如果無法到達目標局面,則輸出 1。2 6 4 13 75 8 移到後 8 1 5 73 642 樣例輸入 2 6 4 ...