n皇后算法c语言递归define,n皇后问题的递归和迭代版 leetcode N-Queens

题目如下图:

db6f3dd3fb5109b1a8bf648a53c5b72f.png

递归版

classSolution {public:

vector> solveNQueens(intn) {

vector dict(n, 0);

dfs(0, dict, n);returnres;

}private:void dfs(int cur, vector & dict, intn)

{if (cur ==n)

{

fillRes(dict);return;

}for (int i = 0; i < n; i++)

{

dict[cur]=i;if(check(dict, cur))

dfs(cur+ 1, dict, n);

}

}void fillRes(vector &dict)

{

vectortmp;for (int i = 0; i < dict.size(); i++)

{string s(dict.size(), '.');

s[dict[i]]= 'Q';

tmp.push_back(s);

}

res.push_back(tmp);

}bool check(vector & dict, intcur)

{for (int i = 0; i < cur; i++)

{if (dict[i] == dict[cur] || abs(dict[cur] - dict[i]) == abs(cur -i))return false;

}return true;

}

vector>res;

};

迭代版

class Solution {

public:

vector> solveNQueens(int n) {

vector> res;

vector nums(n, 0);

int cur = 0;

while (cur >= 0)

{

if (check(nums, cur))

cur = cur + 1;

else

{

int carry = 1;

for (; cur >= 0 && carry != 0;)

{

nums[cur] += carry;

if (nums[cur] == n)

{

nums[cur--] = 0;

carry = 1;

}

else

{

carry = 0;

}

}

}

if (cur == n)

{

fillRes(res, nums);

int carry = 1;

for (cur--; cur >= 0 && carry != 0;)

{

nums[cur] += carry;

if (nums[cur] == n)

{

nums[cur--] = 0;

carry = 1;

}

else

{

carry = 0;

}

}

}

}

return res;

}

private:

void fillRes(vector> & res, vector & dict)

{

vector tmp;

for (int i = 0; i < dict.size(); i++)

{

string s(dict.size(), '.');

s[dict[i]] = 'Q';

tmp.push_back(s);

}

res.push_back(tmp);

}

bool check(vector & dict, int cur)

{

for (int i = 0; i < cur; i++)

{

if (dict[i] == dict[cur] || abs(dict[cur] - dict[i]) == abs(cur - i))

return false;

}

return true;

}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值