博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 51. N-Queens
阅读量:6615 次
发布时间:2019-06-24

本文共 2355 字,大约阅读时间需要 7 分钟。

51. N-Queens 

 ----------------------------------------------------------------------------

Mean: 

N-Queen问题.

analyse:

dfs基本功.

Time complexity: O(N)

 

view code

1.第一发超时了,回过头来看看自己像shi一样的代码也是醉了.

class
Solution
{
public
:
   
vector
<
vector
<
string
>>
solveNQueens(
int n)
   
{
       
__init(n);
       
dfs(
0
,n
,
mat
,
0);
       
return
res;
   
}
   
void
dfs(
int
num
,
int n
,
vector
<
string
>
&
mat
,
int
queen)
   
{
       
if(
num
==n
*n)
       
{
           
if(
queen
==n)
               
res
.
push_back(
mat);
           
return ;
       
}
       
int
row
=
num
/n;
       
int
col
=
num
%n;
       
if(
check(
mat
,
row
,
col
,n))
       
{
           
mat
[
row
][
col
]
=
'Q';
           
dfs(
num
+
1
,n
,
mat
,
queen
+
1);
           
mat
[
row
][
col
]
=
'.';
       
}
       
mat
[
row
][
col
]
=
'.';
       
dfs(
num
+
1
,n
,
mat
,
queen);
   
}
   
bool
check(
vector
<
string
>
&
mat
,
int
row
,
int
col
,
int n)
   
{
       
for(
int
i
=
0;
i
<n;
++
i)
       
{
           
if((
mat
[
row
][
i
]
==
'Q'
&&
i
!=
col) || (
mat
[
i
][
col
]
==
'Q'
&&
i
!=
row))
               
return
false;
       
}
       
// left,up
       
int
x
=
row
,
y
=
col;
       
while(
x
&&
y)
--
x
,
--
y;
       
while(
x
<n
&&
y
<n)
       
{
           
if(
mat
[
x
][
y
]
==
'Q'
&& (
!(
x
==
row
&&
y
==
col)))
               
return
false;
           
++
x
,
++
y;
       
}
       
// right,up
       
x
=
row
,
y
=
col;
       
while(
x
&& (
y
<n
-
1))
--
x
,
++
y;
       
while(
x
<n
&&
y)
       
{
           
if(
mat
[
x
][
y
]
==
'Q'
&& (
!(
x
==
row
&&
y
==
col)))
               
return
false;
           
++
x
,
--
y;
       
}
       
return
true;
   
}
   
void
__init(
int n)
   
{
       
res
.
clear();
       
mat
=*(
new
vector
<
string
>(n
,
string(n
,
'.')));
   
}
private
:
   
vector
<
string
>
mat;
   
vector
<
vector
<
string
>>
res;
};

 

 2.优化了dfs调用和check()函数,效率提升了一个档次.

class
Solution
{
public
:
   
vector
<
vector
<
string
>>
solveNQueens(
int n)
   
{
       
__init(n);
       
dfs(
0
,n
,
mat);
       
return
res;
   
}
   
void
dfs(
int
row
,
int n
,
vector
<
string
>
&
mat)
   
{
       
if(
row
==n)
       
{
           
res
.
push_back(
mat);
           
return ;
       
}
       
for(
int
col
=
0;
col
<n;
++
col)
       
{
           
if(
check(
mat
,
row
,
col
,n))
           
{
               
mat
[
row
][
col
]
=
'Q';
               
dfs(
row
+
1
,n
,
mat);
               
mat
[
row
][
col
]
=
'.';
           
}
       
}
   
}
   
bool
check(
vector
<
string
>
&
mat
,
int
row
,
int
col
,
int n)
   
{
       
// up
       
for(
int
i
=
0;
i
<
row;
++
i)
           
if(
mat
[
i
][
col
]
==
'Q')
               
return
false;
       
// left,up
       
for(
int
i
=
row
-
1
,
j
=
col
-
1;
i
>=
0
&&
j
>=
0;
--
i
,
--
j)
           
if(
mat
[
i
][
j
]
==
'Q')
               
return
false;
       
// right,up
       
for(
int
i
=
row
-
1
,
j
=
col
+
1;
i
>=
0
&&
j
<n;
--
i
,
++
j)
           
if(
mat
[
i
][
j
]
==
'Q')
               
return
false;
       
return
true;
   
}
   
void
__init(
int n)
   
{
       
res
.
clear();
       
mat
=*(
new
vector
<
string
>(n
,
string(n
,
'.')));
   
}
private
:
   
vector
<
string
>
mat;
   
vector
<
vector
<
string
>>
res;
};

转载地址:http://orhso.baihongyu.com/

你可能感兴趣的文章
运维常用命令
查看>>
RelativeLayout相对布局各种常见的问题
查看>>
(转载)C#richTextBox中的内容换行
查看>>
Python 学习笔记之循环
查看>>
requirejs
查看>>
linux下双网卡绑定
查看>>
如何在Android Studio上使用Github
查看>>
C# Lock关键字
查看>>
更改linux系统语言
查看>>
公司那些事-你为谁工作
查看>>
【excel技巧读书笔记013】鼠标小动作
查看>>
Bayes Rule (贝叶斯公式)
查看>>
【初級篇】轻松学会华为LACP链路捆绑及二三层混绑,hybird-vlan,单臂路由
查看>>
Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded
查看>>
RGBA alpha 透明度混合算法
查看>>
取消eclipse js验证
查看>>
HAProxy安装和配置大全
查看>>
exp导出备份数据库 报EXP-00026:指定了冲突模式 .
查看>>
find 命令-exec,xargs用法的一点总结
查看>>
庞俊英:OpenFlow与VxLAN在云网络的应用
查看>>