关于八皇后问题的思考
看到这个问题,又看到了尚硅谷的代码,对于这些算法是怎么搞出来的开始进行进一步的思考
我目前认为可以这样理解:
其实可以以第一视角去试玩
我放了第一个棋子到第一行,
发现可以放,于是我放第二个,放到第一列,
发现不行,然后放第二列,发现又不行,那我放第三列,发现可以了,
那就接着放第四行.也可以,那我继续,
就这样放到了第八列,发现,第一个,不行.那第二个,第二个可以,那第三个.依次尝试完以后.那第七行再换个子试试,于是依次重复
重复的小单元是,我看下这个位置行不行,行就下一行,不行就下一列.
实现之
package recursion;
public class Queue8
{
int max = 8;
int[] array = new int[max];
static int count = 0;
public static void main(String[] args)
{
Queue8 q = new Queue8();
q.place(0);
System.out.println("一共找到了" + count + "个");
}
/**
* 判断当前的行是否可行
*
* @param n
* @return
*/
public boolean judge(int CurRow)
{
for (int i = 0; i < CurRow; i++)
{
if (array[i] == array[CurRow] || // 同一列
Math.abs(CurRow - i) == Math.abs(array[CurRow] - array[i])) // 对角线
{
return false;
}
}
return true;
}
/**
* 按列数放置棋子,冲突则放下一个
*
* @param row
*/
public void place(int CurRow)
{
// 查到最后一行了,打印退出了
if (CurRow == max)
{
print();
return;
}
// 按列依次放置
for (int i = 0; i < max; i++)
{
// 记录到当前行
array[CurRow] = i;
// 判断当前行这么放可不可行
if (judge(CurRow))
{
// 能放的话
// 就开始放下一行了,因为判断方法同理,所以调用递归了
place(CurRow + 1);
}
//不能放就重新收回这个棋子重新放
else
{
array[CurRow] = 0;
}
// 否则就是换下一个位置再放放看
}
}
public void print()
{
count++;
for (int i = 0; i < array.length; i++)
{
System.out.print(array[i] + " ");
}
System.out.println();
}
}