|
8皇后问题:8*8的国际象棋棋盘,摆8个皇后,相互不攻击,皇后攻击同一行,同一列,正反两斜对角线的子。
搜索,总共8个皇后,每个皇后8个位置可能,满足条件就行,和8选8有相似之处:
void dfs(int i)
{
if(i>9) pr();
else for (int k=1;k<=8;k++)
if (can(i,k)) 第i行可以放在第k个位置
{
a(i)=k;dfs(i+1);
}
}
那么重点就在写函数can(i,k) 上
暴力搜索
bool can(int i,int k)
{
bool b=1;
for (int j=1;j<=i-1;j++) if a(j)==k b=0; 前面i-1 行某个和我同列
for (int j=1;j<=i-1;j++) if j+a(j)==k+i b=0; 前面i-1 行某个和我同对角线
for (int j=1;j<=i-1;j++) if ??? b=0; 前面i-1 行某个和我同反对角线
returnb;
} |
|