题意:与1152相似,不过要进行剪枝。即要对每个点的每个方向的节点能否扩展进行判断,并将其排序,选出含有扩展点最少的节点,因为扩展点越少,别的点到此扩展点的概率就越低,从而程序效率更高。
#include <iostream> #include <memory.h> #include <vector> #include <algorithm> using namespace std; bool visited[8][8]; int next_x[] = {-1, -1, -2, -2, 1, 1, 2, 2}; int next_y[] = {-2, 2, 1, -1, 2, -2, 1, -1}; int road[69]; int flag = 0; struct info { int x,y,num;//xy为横纵坐标,num为此点能扩展的点的个数 }; bool com(info a,info b) { return a.num < b.num; } bool Check(int row,int col)//检查一个节点是否出界或者已经被访问过 { if(visited[row][col] == false && row >= 0 && row < 8 && col >= 0 && col < 8) return true; else return false; } bool dfs(int row,int col,int step) { info temp; if(flag == 1) return true; if(step == 64) { flag = 1; for(int i = 0;i < 63;i++) { cout << road[i] << " "; } cout << road[63] << endl; return true; } else { vector<info> data; //data.clear(); for(int i = 0;i < 8;i++) { temp.x = row + next_x[i]; temp.y = col + next_y[i]; temp.num = 0; if(Check(temp.x,temp.y)) { info k; for(int j = 0;j < 8;j++) { k.x = temp.x + next_x[j]; k.y = temp.y + next_y[j]; if(Check(k.x,k.y)) temp.num++; } data.push_back(temp); } } sort(data.begin(),data.end(),com); for(int i = 0;i < data.size();i++) { int next_row = data[i].x; int next_col = data[i].y; visited[next_row][next_col] = true; road[step] = 8 * next_row + next_col + 1; if(dfs(next_row,next_col,step + 1)) return true; visited[next_row][next_col] = false; //road[step] = 0; //step--; //road[step] = 0; } } return false; } int main() { int n; while(cin >> n && n != -1) { memset(visited,false,sizeof(visited)); memset(road,0,sizeof(road)); int current = 1; int start_x = (n - 1) / 8; int start_y = (n - 1) % 8; flag = 0; road[0] = n; visited[start_x][start_y] = true; dfs(start_x,start_y,current); } return 0; }