N皇后问题:
#include <iostream>
#include <cmath>
using namespace std; int N;
int queenPos[];//用来存放算好的皇后位置。最左上角是(0,0) void NQueen(int k); int main()
{
cin >> N;
NQueen(); //从第0行开始摆皇后
return ;
}
void NQueen(int k) //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
{
int i;
if (k == N) // N 个皇后已经摆好
{
for (i = ; i < N; i++)
cout << queenPos[i] + << " ";
cout << endl;
return;
}
for (i = ; i < N; i++)//逐一尝试第k个皇后所在的列i.
{
int j;
for (j = ; j < k; j++)
{
//和已经摆好的 k个皇后的位置比较,看是否冲突
//queenPos[j] == i表示第j个皇后所在的列queenPos[j]与第k个皇后所在的列i相等
//abs(queenPos[j] - i) == abs(k-j)表示第k个皇后和第j个皇后在同一个斜线(行之差与列之差绝对值相等)
if (queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))
{
break; //冲突,则试下一个位置
}
}
if (j == k) //当前选的位置 i 不冲突
{
queenPos[k] = i; //将第k个皇后摆放在第i列
NQueen(k + );
}
} //for( i = 0;i < N;i ++ )
}
2N皇后:
#include<iostream>
#include<math.h>
using namespace std;
#define N 100
int wq[N]; //whitequeen,黑皇后位置
int bq[N]; //blackqueen,白皇后位置
int cb[N][N]; //chessboard,棋盘
int num; //皇后数目
int count = ; //不同放置情况计数 int bqueen(int pos) //黑色皇后放置
{
int i;
for (i = ; i < pos - ; i++)
{
int judge = bq[i] - bq[pos - ];
if ( == judge || abs(judge) == abs(pos - - i))
return ;
}
if (pos == num)
{
::count++;
return ;
} for (int i = ; i < num; i++)
{
if (i != wq[pos] && cb[pos][i])
{
bq[pos] = i;
bqueen(pos + );
}
}
}
int wqueen(int pos) //白色皇后放置
{
int i;
for (i = ; i < pos - ; i++)//处理之前置入的皇后,判断是否冲突,冲突就返回,同时貌似放在这边还能使递归能返回,很巧妙,博主我只是搬运
{
int judge = wq[i] - wq[pos - ];
if ( == judge || abs(judge) == abs(pos - - i ))
return ;
} //当前的pos意为已经有pos个放好了,这次函数在处理pos+1的调用
if (pos == num)//放满了才会调用
{
bqueen();
return ;
} for (int i = ; i < num; i++)
{
if (cb[pos][i])//该位置是否能放,能放的话,每一个都试一下,如果不行,会返回0----当前不判断的是否能放,由N+1
//来查看N次是否能放,不能放就会返回0
{
wq[pos] = i;
wqueen(pos + );
} }
} int main()
{
cin >> num;
for (int i = ; i < num; i++)
for (int j = ; j < num; j++)
cin >> cb[i][j];
wqueen();//先白后黑
cout << ::count;
return ;
}