[Sicily 1153 马的周游问题] 优化思想:改变搜索顺序

#include<iostream> 
#include<vector>//1153马的周游问题:(优化基本思想)先搜索可行格较少的格子 
#include<algorithm> 
using namespace std;
const int SIZE = 65;
int visited[SIZE];
int route[SIZE];
int cnt_size[SIZE];
int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
int dy[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
vector<int> neighbors[SIZE];//neighbors[i][j]记录的是马可以从i到j 

bool cmp(int x, int y)
{
return cnt_size[x] < cnt_size[y];
}

int get_child_size(int child)
{
int size = 0;
for(int i = 0; i < neighbors[child].size(); i++)
{
if(!visited[neighbors[child][i]])
    size++;
}
return size;
}

void get_children(int x, vector<int> &children)
{
    for(int i = 0; i < neighbors[x].size(); i++)
    {
        int child = neighbors[x][i];
        if(!visited[child])
        {
            children.push_back(child);
            cnt_size[child] = get_child_size(child);
        }
    }
    sort(children.begin(), children.end(), cmp);//排序,可行格较少的排在前面 
}

void print_route()
{
    for(int i = 1; i < SIZE - 1; i++)
        cout << route[i] << " ";
    cout << route[SIZE - 1] << endl;
}

bool dfs(int x, int depth)
{
    route[depth] = x;//route[]记录路径 
    if(depth == (SIZE - 1))
    {
        print_route();
        return true;
    }

    visited[x] = 1;

    vector<int> children;//存放x点的还未被visit的neighbors 

    get_children(x, children);

    for(int i = 0; i < children.size(); i++)
    {
        if(dfs(children[i], depth + 1))//如果某一个点可以继续搜下去,就返回true 
            return true;
        //如果不能继续搜下去,就搜索下一个children 
    }
    visited[x] = false;//如果这个点的所有children都搜索不下去,则回溯 
    return false;
}

int main()
{
    int start;//马的起点为start,范围是1到64 
    while(cin >> start && start != -1)
    {
    //初始化 
        for(int i = 0; i < SIZE; i++)
            visited[i] = 0;        
        for(int i = 0; i < SIZE; i++)
            neighbors[i].clear();

        for(int i = 1; i < SIZE; i++)
        {
            int row = (i + 7) / 8;//计算i点在第几行 
            int column = i - (row - 1)* 8;//计算i点在第几列 
            for(int j = 0; j < 8; j++)//对于每一个i点,计算出它的neighbors 
            {
                int nx = row + dx[j];
                int ny = column + dy[j];
                if(nx >= 1 && nx <= 8 && ny >=1 && ny <= 8)
                    neighbors[i].push_back((nx - 1) * 8 + ny);
            }
        }
        dfs(start, 1);
    }
    return 0;
}                                 
    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/Xiao13Yu14/article/details/46063531
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞