当前位置:网站首页>n皇后求解单一解问题
n皇后求解单一解问题
2022-08-08 21:22:00 【lhf2112】
文章参考了博客http://blog.csdn.net/hackbuteer1/article/details/6657109,该文对n皇后问题进行了详细的阐述,并给出了全部解问题的C的实现
仿照其实现,在此备份求单一解的Java程序。
public class Main {
static final int num = 2; //皇后数量
static final int non = -10000; //代表空棋盘
void Init(int n, int [] chessboard){ //棋盘的初始化
for (int i=0;i<n;i++){
chessboard[i] = non;
}
}//Init
boolean NoClash (int row, int col,int[] chessboard){ //判断皇后是否产生冲突,没有冲突返回true
for(int i=0;i<num;i++){
if(chessboard[i] == col|| Math.abs(i-row)==Math.abs(chessboard[i]-col)){
return false;
}
}
return true;
}//Clash
void print(int[] chessboard){
for(int i=0;i<num;i++){
System.out.print(chessboard[i]+" ");
}
}
public static void main(String[] args) {
int n = num;
int flag = 0; //flag 代表解的个数
int [] chessboard = new int[n];
Main m = new Main();
m.Init(n,chessboard);
int i=0,j=0; //i进行行扫描,j进行列扫描
while(i<n){
while(j<n){
if(m.NoClash(i, j, chessboard)){ //位置i,j可以放一个皇后
chessboard[i] = j; //在i行j列放一个皇后
j = 0; //下一行从第0列开始放置皇后
break;
}//if
else{
j++; //在j+1列进行尝试
}//else
}//while(j<n)
if(chessboard[i] == non){ //第i行没能找到解
if(i == 0) //i是第一行了,说明没有解了
break;
else{ //否则要进行回溯
i--; //上一行
j = chessboard[i]+1; //j从上一行的原位置+1开始搜索
chessboard[i] = non; //清空第i行棋盘
continue;
}//else
}//if
if(i==num -1){ //在最后的一行找到了位置,即找到了解
m.print(chessboard);
flag++;
break;
}//if
i++;
}//while(i<n)
if(flag == 0){
System.out.println("无解");
}
}//main
}
边栏推荐
猜你喜欢
随机推荐
修改浏览器滚动条样式
Crawler series: read CSV, PDF, Word documents
MATLAB综合实例:部门工资统计图分析
The crawler series: use MySQL to store data
如何改变数组对象里面的key 键名字
Redis之HyperLogLog
numpy基础
快速实现分列转到行(SQL版)一个问题,三种解法!
Excel摸鱼技巧:快速实现分列转到行
为什么要做LiveVideoStack课程?
微信小程序--》数据请求和页面导航
爬虫系列:存储 CSV 文件
零数科技受邀出席2019全球未来出行大会
ESLint: The Function constructor is eval. (no-new-func)错误解决
零数科技深耕苏州,受邀参加中国金融科技产业峰会
一、Canvas应用的背景(个人理解)及基础语法
js写一个小米首页轮播图
小程序——切割字符串
封装 uniapp request 请求
力扣每日一题----求第n位斐波那契数