第一次使用双向广搜算法求解,感觉效率的确提高了不止两倍。刚开始的一直WA,后来发现是每次都要扩展一层的节点,然后在扩展另一层的节点,而不是每次只扩展一个节点。 /* Author: ACb0y Date: 2010-9-21 Type: bbfs(双向广搜) ProblemId: hdu 1195 Open the Lock Result: AC */ #include <iostream> #include <queue> using namespace std; struct node { char digit[5]; int step; }; int n; //初始化状态搜索标记数组(标记要达到某种状态需要的步数) int mark1[11][11][11][11]; //最终状态搜索标记数组(标记要达到某种状态需要的步数) int mark2[11][11][11][11]; //初始状态 char a[5]; //最终状态 char b[5]; void bbfs() { int i; //初始化标记数组 memset(mark1, -1, sizeof(mark1)); memset(mark2, -1, sizeof(mark2)); //广搜使用的队列 queue<node> Q1; queue<node> Q2; node cur, q, temp; strcpy(q.digit, a); q.step = 0; Q1.push(q); strcpy(q.digit, b); q.step = 0; Q2.push(q); int flag = 1; //用来标记当前的步数 int pre1 = 0; int pre2 = 0; while (1) { //用广度优先扩展一层正向的节点如果发现扩展出来的节点在反向节点中出现则输出结果 while (!Q1.empty() && Q1.front().step == pre1) { int k; cur = Q1.front(); Q1.pop(); //如果当前的状态没有被标记,则标记 if (mark1[cur.digit[0] - '0'][cur.digit[1] - '0'][cur.digit[2] - '0'][cur.digit[3] - '0'] == -1) mark1[cur.digit[0] - '0'][cur.digit[1] - '0'][cur.digit[2] - '0'][cur.digit[3] - '0'] = cur.step; //扩展出来的节点在反向节点中出现,则输出答案 k = mark2[cur.digit[0] - '0'][cur.dig