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

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

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;
};

转载于:https://www.cnblogs.com/crazyacking/p/5300943.html

你可能感兴趣的文章
MyBatis3: Could not find SQL statement to include with refid ‘
查看>>
scala spray 概念性内容的总结
查看>>
Spring中配置数据源的4种形式(转)
查看>>
分享9款极具创意的HTML5/CSS3进度条动画
查看>>
Windows 之 CMD命令
查看>>
SQL_Server2005自动备份与删除—维护计划
查看>>
第4周 页面限制8060 bytes
查看>>
设置myeclipse自动生成的author等注释
查看>>
【Cocos2d-Js基础教学 入门目录】
查看>>
【转】ActionBar的基本用法
查看>>
Linux 多线程通信
查看>>
PostgreSQL服务端监听设置及client连接方法
查看>>
Javascript事件总结
查看>>
(原创)speex与wav格式音频文件的互相转换(二)
查看>>
C#中模拟用户登陆SharePoint网站
查看>>
用css3实现各种图标效果(1)
查看>>
Bind("入库日期", "{0:yyyy-MM-dd}") 关于asp.net格式化数据库日期字符串
查看>>
TortoiseSvn客户端出现Http state 405 'Method Not Allowed' 的解决办法
查看>>
layoutSubviews总结
查看>>
目标检测的图像特征提取(一)HOG特点
查看>>