SWUST OJ 1768 n皇后问题
2016-04-11 20:57
302 查看
【题意】这题也是醉了,其实不用怎么剪枝啊,只需要把m==0的情况列个表,还一直以为m==1的时候列表,好毒。
【分析】就是普通的n皇后问题,由于可能有一个点已经有皇后,开始的时候标记就行啦!其实暴力,全部打表也可以,可是还是不会呀!
【AC代码】
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 14;
int vis[4][30];
int ans[14] = {0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712};
int n,m,x,y,sum;
void dfs(int dep)
{
if(dep==n)
{
sum++;
return ;
}
if(vis[0][dep])
dfs(dep+1);
else
{
for(int i=0;i<n;i++)
{
if(!vis[1][i]&&!vis[2][dep-i+n]&&!vis[3][dep+i])
{
vis[1][i]=vis[2][dep-i+n]=vis[3][dep+i]=1;
dfs(dep+1);
vis[1][i]=vis[2][dep-i+n]=vis[3][dep+i]=0;
}
}
}
}
//void dfs(int dep)
//{
// if(dep==n)
// {
// if(m==0)sum++;
// else if(m==1&&C[x]==y)
// {
// sum++;
// }
// }
// else
// for(int i=0;i<n;i++)
// {
// int ok=1;
// C[dep]=i;
// for(int j=0;j<dep;j++)
// {
// if(C[dep]==C[j]||dep-C[dep]==j-C[j]||dep+C[dep]==j+C[j])
// {
// ok=0;
// break;
// }
// }
// if(ok)dfs(dep+1);
// }
//}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(m==0)
{
printf("%d\n",ans
);
continue;
}
if(m==1)scanf("%d%d",&x,&y);
memset(vis,0,sizeof(vis));
if(m==1)
{
vis[0][x]=1;
vis[1][y]=1;
vis[2][x-y+n]=1;
vis[3][x+y]=1;
}
sum = 0;
dfs(0);
printf("%d\n",sum);
}
return 0;
}
【分析】就是普通的n皇后问题,由于可能有一个点已经有皇后,开始的时候标记就行啦!其实暴力,全部打表也可以,可是还是不会呀!
【AC代码】
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 14;
int vis[4][30];
int ans[14] = {0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712};
int n,m,x,y,sum;
void dfs(int dep)
{
if(dep==n)
{
sum++;
return ;
}
if(vis[0][dep])
dfs(dep+1);
else
{
for(int i=0;i<n;i++)
{
if(!vis[1][i]&&!vis[2][dep-i+n]&&!vis[3][dep+i])
{
vis[1][i]=vis[2][dep-i+n]=vis[3][dep+i]=1;
dfs(dep+1);
vis[1][i]=vis[2][dep-i+n]=vis[3][dep+i]=0;
}
}
}
}
//void dfs(int dep)
//{
// if(dep==n)
// {
// if(m==0)sum++;
// else if(m==1&&C[x]==y)
// {
// sum++;
// }
// }
// else
// for(int i=0;i<n;i++)
// {
// int ok=1;
// C[dep]=i;
// for(int j=0;j<dep;j++)
// {
// if(C[dep]==C[j]||dep-C[dep]==j-C[j]||dep+C[dep]==j+C[j])
// {
// ok=0;
// break;
// }
// }
// if(ok)dfs(dep+1);
// }
//}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(m==0)
{
printf("%d\n",ans
);
continue;
}
if(m==1)scanf("%d%d",&x,&y);
memset(vis,0,sizeof(vis));
if(m==1)
{
vis[0][x]=1;
vis[1][y]=1;
vis[2][x-y+n]=1;
vis[3][x+y]=1;
}
sum = 0;
dfs(0);
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- Bzoj3239:Discrete Logging:BSGS模板题
- 数学问题(1):杨辉三角、水仙花数、打印斐波那契数列
- 算法_动态规划_租用游艇问题
- windows多线程系列002_利用互斥对象实现线程同步
- bzoj3611: [Heoi2014]大工程
- 搭建轻量级git server和git web UI
- spring@value注入spel表达式
- 父类与子类的关系
- JAVA大作业 - 五道三星题
- python学习9-语句
- 模拟——Educational Codeforces Round 11——B
- 字符统计(改1)
- linux下管道及重定向
- YTU 3008: 链串的基本运算
- SHTSC2011(SHOI) 双倍回文 一道用Manacher优化的动态维护题
- vector 详细用法 C++
- Centos7 ssh修改默认端口号
- LeetCode Best Time to Buy and Sell Stock III
- Hibernate 检索策略
- 数据结构 --- 线性表学习(php模拟)