四皇后
来源:互联网 发布:js金额大写转换函数 编辑:程序博客网 时间:2024/04/30 01:17
public class 四皇后 {
/**
* 四皇后问题求解 :如何在4*4的棋盘上无冲突的摆放4个皇后棋子。
* 国际象棋中,皇后的移动方式为横竖交叉的,因此任意一个皇后所在的位置的水平、竖直以及45度斜线上都不能出现其他皇后的棋子
* 思想:构造出一棵解空间树,通过探索这棵解空间树,可以得到四皇后问题的一种或几种解。这样的解空间树共有4棵(比较浪费资源)。
* 其实,它完全可以通过一个"递归回溯"来模拟,所谓解空间树只是一个逻辑上的抽象。
*/
public static void main(String[] args) {
int Q[][] = new int[4][4];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Q[i][j]=0;
}
}
Queen(0,Q);
}
static void Queen( int k, int Q[][] ){ //K为列 i为行
int i,j;
if(k==4 ){ //递归结束条件
System.out.println("k=4");
for( i=0;i<4;i++ ){ //得到一个解,在屏幕上输出结果
for( j=0;j<4;j++ ){
System.out.print(Q[i][j]);
}
System.out.println();
}
return;
}
for( i=0;i<4;i++ ){
if( isCorrect(i,k,Q) == 1){ //若Q[i][k]可以放置皇后(剪枝)
Q[i][k] = 1; //放置皇后
System.out.println("行:"+i+"..列:"+k+"插入1");
Queen(k+1,Q); //递归深度优先搜索解空间树
Q[i][k] = 0; //回溯操作
}
}
System.out.println();
}
static int isCorrect( int i,int j,int Q[][] ){ //返回0不可放置,1可放置
int s,t;
for( s=i,t=0;t<4;t++ ){
if( Q[s][t]==1 && t!=j ) return 0; //判断行
}
for( t=j,s=0;s<4;s++ ){
if( Q[s][t]==1 && s!=i ) return 0;//判断列
}
for( s=i-1,t=j-1;s>=0&&t>=0;s--,t-- ){
if( Q[s][t]==1 ) return 0;//判断左上方
}
for( s=i+1,t=j+1; s<4&&t<4; s++,t++ ){
if( Q[s][t]==1 ) return 0;//判断右下方
}
for( s=i-1,t=j+1; s>=0&&t<4; s--,t++){
if( Q[s][t]==1 ) return 0;//判断右上方
}
for( s=i+1,t=j-1; s<4&&t>=0; s++,t-- ){
if( Q[s][t]==1 ) return 0;//判断左下方
}
return 1;
}
}
1 0
- 四皇后
- 四皇后问题
- 四皇后问题
- 1.四皇后
- 四皇后问题的回溯
- 四皇后、八皇后……的求解
- dfs模板(回溯、四皇后)poj1321
- 数据库约束解四皇后问题
- 回溯法——四皇后问题
- 递归研究(四) 八皇后问题
- 第六章(9).四皇后问题
- 经典的四皇后问题深度搜索
- 回溯经典算法之四皇后问题
- 八皇后问题详解(四种解法)
- 皇后
- 四皇后问题(同理适用于n皇后问题)图片版
- 回溯法解决N皇后问题(以四皇后为例)
- JNI学习之步步深入四--皇后的祝福
- runTime 初级
- NGUI UILabel计算文字行数
- #!/usr/bin/env python与#!/usr/bin/python的区别
- 求最大次大数
- 1042. 字符统计(20)
- 四皇后
- ASP.NET中如何实现FORM认证登录
- Android编程之fill_parent、wrap_content和match_parent的区别
- ContentProvider再探——Document Provider
- 填数游戏
- 用筛选法求解素数
- 详解android:scaleType属性
- 折半查字法
- linux下命令行 mail 发邮件方法