算法 N皇后问题
来源:互联网 发布:windows7摄像头软件 编辑:程序博客网 时间:2024/05/17 04:07
题目
在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
暴力法:
#include <stdio.h> #include <math.h> #define n 8int a[n];//元素值为皇后所在列的位置 int temp,i,j,num;int flag;int count = 0;int main(){ for(num=0; num<pow(n,n); num++){ temp=num; flag = 1; for(i=0; i<n; i++){ a[i]=temp%n; temp=temp/n; } for(i=0; i<n; i++){ for(j=i+1; j<n; j++){ //绝对值,判断皇后是否在同行,或者斜线方向 if(a[i]==a[j] || abs(i-j)==abs(a[i]-a[j]) ){ flag=0; break; } } } if(flag==1) count++; } printf("%d\n",count); return 0;}
回溯法:
#include <stdio.h> #include<math.h>#define n 8int a[n];int count=0;//在第t列是否可放置int ok(int t){ for(int k=0; k<t; k++){ if(a[k]==a[t] || abs(k-t)==abs(a[k]-a[t])){ return 0; } } return 1;}void dfs(int t){ if(t==n) count++; else{ for(int i=0; i<n; i++){ a[t]=i;//对于第t行,第i列,放置皇后. //判断刚才放置的位置是否可行,如果可行,就放置下一行。不可行的话,继续在第t行放置 if(ok(t)){ dfs(t+1); } } }}int main(){ dfs(0); printf("%d.\n",count); return 0; }
0 0
- N皇后问题算法
- N皇后问题算法
- 【算法】n皇后问题
- 算法-n皇后问题
- 算法 N皇后问题
- N皇后问题求解算法
- 回溯算法n皇后问题
- LasVegas算法 n皇后问题
- N皇后问题(算法)
- n-皇后问题 算法代码
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- 目前最快的N皇后问题算法!!!
- 求 N 皇后问题回溯算法
- n皇后问题——回溯算法
- N皇后问题摆法算法描述
- QS2算法求解N-皇后问题
- 回溯算法之 N皇后问题
- 算法系列——N皇后问题
- bootstrap使用经验点滴
- ds 2.3 击鼓传花
- 编译原理是什么?怎么学?
- MySQL基础
- 中英文对照 —— 互联网、IT(信息科技)、编程
- 算法 N皇后问题
- Mvp理论浅析
- 位运算求平均数
- HTML
- (笔记)Spring MVC学习指南_JSTL
- 参数化查询为什么能够防止SQL注入
- 2-DDL
- BIST测试SRAM时要必须保证对所有端口可控
- 递归算法,JavaScript实现