最近在上java课遇到了一个八皇后的问题,在博客上搜索八皇后问题发现java版的代码很少,同时解释的也很少,这里将详细解释思路与代码,核心思路为迭代,本文章是给新手看的,大佬可以直接跳过,新手看不懂的话算我输。
首先是问题描述。
思路:
我们的思路是程序要包含三个方法:1.主方法 2.判断方法1 3.判断方法2 4.输出方法
首先说判断方法2,判断方法2的作用是判断该位置的皇后是否合法。本文采用以行的方法,一行一行赋值。所以该方法将当前的列位置与之前存在的皇后的位置进行比较判断并返回true or false。
判断条件有三个:
1.不与之前的皇后同列:从第一个皇后到当前皇后的前一个皇后,循环判断皇后的位置是否与当前的列位置相同,相同返回false。
//j为当前判断的列
//判断是否与之前的那些皇后在一个列
//一直寻找到第k-1个皇后,即上一个皇后
for(int i=0;i<k;i++)
{
if(index[i]==j)
{
return false;
}
}
2.不在之前的皇后的左下斜线上:首先要从当前皇后的前一个皇后判断,如果该位置在前一个皇后的左斜线上
则该列位置+1等于前一个皇后的位置(列);以此类推,之后判断前皇后的前一个皇后,记为前前皇后,如果在前前一个皇后的左斜线上,即该列位置+2等于前前一个皇后的位置(列)。
//判断当前列是否在上一个皇后的右下斜线上;
// k为当前寻找的皇后,故上一个皇后为k-1
//xo
//ox
//此时当前列向前一列就会和上一个八皇后的列位置相同
//xoo
//ooo
//oox
//此时需向前两列去比较上上一个八皇后
for (int lie=j-1,hang=k-1;lie>=0&&hang>=0;lie--,hang-- )
{
if(index[hang]==lie) {
return false;
}
}
3.不在之前的皇后的右下斜线上:与之前的同理,首先要从当前皇后的前一个皇后判断,如果该位置在前一个皇后的右斜线上。则该列位置-1等于前一个皇后的位置(列);以此类推,之后判断前皇后的前一个皇后,记为前前皇后,如果在前前一个皇后的左斜线上,即该列位置-2等于前前一个皇后的位置(列)。
//判断当前列是否在上一个皇