博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2553N皇后问题
阅读量:6373 次
发布时间:2019-06-23

本文共 3263 字,大约阅读时间需要 10 分钟。

打表 

 

#include
using namespace std; int a[11]={0,1,0,0,2,10,4,40,92,352,724}; int main() { int n; while(scanf("%d",&n)>0&&n) { printf("%d\n",a[n]); } return 0; }

 

 

/************************************************************ * Author        : rudolf * Last modified : 2013-04-23 15:27 * Filename      : caogao.cpp * Description   : * *********************************************************/#include 
#include
#include
using namespace std;int map[20],a[20],hang[20],n,cnt;void DFS(int num){ int i,j,flag; if(num==n+1)//到n也成立了才会搜索n+1 { cnt++;return; } for(i=1;i<=n;i++) if(!hang[i])//不在同一行 { flag=1;map[num]=i;//第num列第i行放第num个皇后 for(j=1;j
>m&&m!=0) cout<
<

 

 

/**n皇后问题,由于N 是小于等于10的正整数,所以可以使用打表的方法把前十中情况全部找出来存起来然后每次输入时不用重新的计算了。*/#include 
#define NUMS 10/*输入的数字1---10*/int N;/*棋盘*/int chessboard[11][11];/* 用来记录拜访数目 */int cal;/*检查皇后放置此行此列是否可以,可以返回1,不可以返回0此递归是一行一行找的,K是棋盘的长度*/int dfs_check(int row,int column,int k){ /* 说明已经到了棋盘的界外,前边都符合了 */ if(row>k) { cal++; return 1; } /* 正上方是否有皇后*/ for(int i = 1; i < row; i++) /* 如果有皇后则返回不能放置这里返回0*/ if(chessboard[i][column] == 1) return 0; /* 左右上方45度角检查是否可以*/ /* 左上方*/ for(int i=row-1,j=column-1;i>0&&j>0;i--,j--) if(chessboard[i][j] == 1) return 0; /* 右上方*/ for(int i=row-1,j=column+1;i>0&&j<=k;i--,j++) if(chessboard[i][j] == 1) return 0; /*标记这个位置成功了*/ chessboard[row][column] = 1; /*进行下一行搜索*/ for(int i=1;i<=k;i++) if(dfs_check(row+1,i,k)==1) break; chessboard[row][column] = 0; return 0;}int main(){ int i,j,k; int count[11]; /*打表*/ for(k=1;k<=NUMS;k++) { count[k] = 0; cal = 0; /*首先将棋盘初始化全部置为0*/ for(i=0;i<=NUMS;i++) for(j=0;j<=NUMS;j++) chessboard[i][j]=0; for(i=1;i<=k;i++) dfs_check(1,i,k); count[k] = cal; } while(scanf("%d",&N)!=EOF&&N!=0) printf("%d\n",count[N]); return 0;}

 

回溯法(转)能力有限,理解不了他的代码http://blog.csdn.net/alongela/article/details/6755770

 

用回溯法就可以解决,设皇后的编号依次为1,2,……,n,则可以认为第i个皇后必须摆放在第i行,然后枚举第一个皇后的位置进行回溯,若某一次发现某个皇后无法找到摆放位置则直接返回,如果所有皇后都可以找到摆放位置,则说明存在一种摆法满足要求,统计有多少种摆法即可。

此题n<=10,测试数据中会有大量重复数据,因此要保存答案,遇到曾经计算过的n直接输出即可,否则可能会超时。

 

#include
using namespace std;int n;int x[100];int ans[11];bool Place(int k){ int i = 1; while (i
0) { printf("%d\n", ans[n]); continue; } x[1] = 0; k = 1, cnt = 0; while (k>0) { x[k]++; while (x[k]<=n && !Place(k)) { x[k]++; } if (x[k]<=n) { if (k==n) { cnt++; } else { k++; x[k] = 0; } } else k--; } ans[n] = cnt; printf("%d\n", cnt); } return 0;}

 

dfs

 

#include
#include
using namespace std; int s[12][12],n,count; int panduan(int h,int l) { for(int i=0;i
n*n)return; i=num/n; j=num%n; if(s[i][j]==0&&panduan(i,j)) { s[i][j]=1; dfs(num+1,f-1); s[i][j]=0; } dfs(num+1,f); } int main() { while(scanf("%d",&n)>0&&n) { memset(s,0,sizeof(s)); count=0; dfs(0,n); //printf("\n\n"); printf("%d\n",count); } return 0; }

 

 

你可能感兴趣的文章
不同工具查看代码分支diff的差异
查看>>
一文 | 跨域及其解决方案
查看>>
[LeetCode] 671. Second Minimum Node In a Binary Tree
查看>>
深度解析国内首个云原生数据库POLARDB的“王者荣耀”
查看>>
详解vue全局组件与局部组件使用方法
查看>>
你还没有撸一个包扔到npm上?
查看>>
白话Java I/O模型
查看>>
python继承与多重继承
查看>>
数据挖掘(一):引论
查看>>
小程序开发实践总结
查看>>
在 web 上使用 JavaScript 模块
查看>>
IP正则表达式
查看>>
CMS垃圾回收和线上Full GC排查
查看>>
前端react+redux+koa写的博客推荐
查看>>
Vue render深入窥探之谜
查看>>
流畅的 Python - 2. 字典与集合
查看>>
vue项目中的常见问题(vue-cli版本3.0.0)
查看>>
mybatis三剑客之mybatis-generator
查看>>
徒手撸UI之Tree
查看>>
基于Spring Cloud 快速配置完成单点登录开发
查看>>