这题难点在于判断是否冲突
特别是斜方向的该怎么判断
可以看看这两个图
我们认为横轴方向为横坐标记为x,纵轴方向为纵坐标记为y
在图一我们可以发现:
这三个白色方格x与y之和都是4
在图二我们可知
这三个白色方格x与y之差都是0
所以判断斜方向,即x1-y1 == x2-y2 || x1+y1 == x2+y2即可
code代码
#include <bits/stdc++.h>
using namespace std;
int n;
int tot,sum,ans[15];
bool mp[15];
bool check(int u)
{
for(int i = 1; i <= u-1; i++)//u-1是因为检查其之前的就行了
{
if(ans[i] == ans[u] ||//检查列
i - ans[i] == u - ans[u] ||//右斜下方向
i + ans[i] == u + ans[u])//左斜下方向
return false;//冲突
}
return true;
}
void dfs(int u)
{
if(u == n+1)
{
sum++;
tot++;
if(sum <= 3)
{
for(int i = 1;i <= n; i++)
cout << ans[i] << " ";
cout << endl;
}
return;
}
for(int i = 1; i <= n; i++)
{
if(mp[i] == false)
{
ans[u] = i;
mp[i] = true;
if(check(u))
dfs(u+1);
mp[i] = false;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
dfs(1);
cout << tot;
return 0;
}