题意: 一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
算法:dfs
问题:将所有占据的直线斜线标记,最后取消,忽略了重复的情况。
思路:分别用数组表示行、列、对角线的情况(行无需表示)不重复2n-1条对角线
代码:ac
#include<bits/stdc++.h>
using namespace std;
int a[15];/*列*/
int c[30];/*副对角线*/
int d[30];/*主对角线*/
int num[15];
int n;
int cnt;
void dfs(int i);
int main()
{
scanf("%d", &n);
cnt = 0;
dfs(1);
printf("%d\n", cnt);
return 0;
}
void dfs(int i)
{
if (i == n+1&&cnt<3) {
for (int j = 1; j <= n; j++) {
printf("%d ", num[j]);
}
printf("\n");
cnt++;
return;
}
if (i == n+1) {
cnt++;
return;
}
for (int j = 1; j <= n; j++)
{
if (a[j] == 0 && c[i + j - 1] == 0 && d[n - i + j] == 0) {
num[i] = j;
a[j] = 1; c[i + j - 1] = 1; d[n - i + j] = 1;
dfs(i + 1);
a[j] = 0; c[i + j - 1] = 0; d[n - i + j] = 0;
}
}
return;
}