八皇后问题(初识)

来源:互联网 发布:詹姆斯选秀体测数据 编辑:程序博客网 时间:2024/06/01 14:09

注意:vis数组因为有[cur - i + n]至少要开两倍大

1.什么是八皇后问题?

同一行,同一列,同一对角线只能放一个皇后

2.当n较小为8时可以直接用dfs搜索

不做优化之前

void search(int cur,int v){    if(cur == n)    {        ans = max(ans,v);        return;    }    for(int i = 0; i < n; i ++)    {        int ok = 1;        C[cur] = i;        for(int j = 0; j < cur; j ++)//遍历所有之前的点,判断是否有同列和同对角线的。因为是一行一行遍历的同行是不用考虑的。通对角线考虑两种主对角线和复        //对角线       {            if(C[cur] == C[j] || C[cur] + cur == C[j] + j || C[cur] - cur == C[j] -j)            {                ok = 0;                break;            }        }        if(ok)        {            search(cur + 1,v + a[cur][i]);        }    }}

当然这样的复杂度是不够用的

利用vis[2][]二维数组,判断之前是否有点在当前的列或对角线上

void search(int cur,int v){    if(cur == n)    {        ans = max(ans,v);        return;    }    for(int i = 0; i < n; i ++)    {        if(!vis[0][i] && !vis[1][cur + i] & !vis[2][cur - i + n])        {            vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;            search(cur + 1,v + a[cur][i]);            vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;//注意一定要改回来        }    }}

注意要清空vis

vis数组的第二维要开到n的二倍多


0 0