回溯法N皇后问题(以8为例)

N皇后问题:有一个N*N的棋盘,要在棋盘上放N个皇后,要求这N个皇后的位置不能同行同列同对角线。

解决:放入第i个皇后时,应该与前面i-1个皇后都不冲突,即都不同行同列同对角线,满足则放下不满足则换位置,若第i行所有位置都不满足则回溯到第i-1个皇后,让第i-1个皇后换位置直至满足要求。

注意:回溯的话就必定要做标记,可以建立一个N*N的二维数组,初始化为0,0代表没尝试过,2代表冲突,1代表合适。注意第i行所有都不是合适时,应将第i行全部置0,然后回溯到i-1行,使原来的值变为2。

代码:

#include<iostream>
#include<cmath>

using namespace std;

bool isValid(int *columns, int r)                                          //columns[r]=c表示有个皇后位于r行c列。
{
    for(int i=0; i<r; i++)
    {
        if(columns[i]==columns[r])
        {
            return false;
        }
        else if(abs(columns[i]-columns[r])==r-i)
        {
            return false;
        }
    }

    return true;
}

int main()
{
    int table[8][8]={0};
    int columns[8]={0};
    for(int i=0; i<8; i++)
    {
        for(int k=0; k<8; k++)
        {
            if(table[i][k]==0)
            {
                columns[i]=k;
                if(isValid(columns, i))
                {
                    table[i][k]=1;
                    break;
                }
                else
                {
                    table[i][k]=2;
                }
            }
            if(k==7)
                {
                    for(int j=0; j<8; j++)
                    {
                        table[i][j]=0;
                    }
                    i--;
                    table[i][columns[i]]=2;
                    i--;
                }
        }
    }
    for(int i=0; i<8; i++)
    {
        cout << columns[i] << endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值