注意:
数组大小要开够,数据范围是6到13,要开到20,不然开到15数据点没法全部过·。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>using namespace std;int n;
int t=0;//记录前三次
bool col[20],dg[20],udg[20];//记录每个数字的状态
int path[20]={-1};//记录路径
int cnt;//记录最终个数 void dfs(int u)
{if(u == n){if(t < 3){for(int i = 0; i < n; i ++){printf("%d ",path[i]);} printf("\n");t++;}cnt++;return ;}for(int i = 1; i <= n; i ++){if(!col[i] && !dg[u + i] && !udg[n + i - u]){col[i] = dg[u + i] = udg[n + i - u] = true;path[u] = i;dfs(u+1);col[i] = dg[u + i] = udg[n + i - u] = false;} }return;
}
int main()
{scanf("%d",&n);dfs(0);printf("%d",cnt);return 0;
}