回溯法求解八皇后问题
作者:随风 日期:2007-07-05 15:30:30
根据实验课上的程序自己用Java语言改写的,没什么太大的技术含量,贴上来保留而已。
程序代码
import java.math.*;
import java.io.*;
public class Test {
static int N=8;
private int[] Queen=new int[N+1];
private int _ResultCount;
public Test()
{
_ResultCount=0;
for(int i=1;i<=N;i++)
{
Queen[i]=0;
}
}
private boolean Place(int k)
{
for(int i=1;i<k;i++)
{
if(Queen[i]==Queen[k] || Math.abs(Queen[i]-Queen[k])==Math.abs(i-k))
{
return false;
}
}
return true;
}
private void PrintResult()
{
_ResultCount++;
System.out.print("第"+_ResultCount+"组解是:");
for(int i=1;i<=N;i++)
{
System.out.print(Queen[i]+" ");
}
System.out.println();
}
private void Queens()
{
int k=1;//Queen[k]=0; //k表示的是第几行 Queen[k]表示的是第k行的皇后放在的列数
while(k>=1)
{
Queen[k]++;
while(Queen[k]<=N && Place(k)==false)
{
Queen[k]++; //寻找该行可放皇后的位置
}
if(Queen[k]<=N) //如果找到了可以放皇后的位置
{
if(k==N) //如果全部的位置都已经放好了皇后,则输出解
{
PrintResult();
}
else //向下搜索
{
k++;
}
}
else
{
Queen[k]=0; //恢复前面的值,重要
k--; //回溯 ,在该行不能放皇后的情况下
}
}
}
///实验,已知几个皇后的位置,求是否可以在第八行放入一个皇后
private void ShiYan()
{
Queen[1]=4;
Queen[2]=6;
Queen[3]=8;
Queen[4]=2;
Queen[5]=7;
Queen[6]=1;
Queen[7]=3;
for(int i=1;i<=N;i++)
{
Queen[8]=i;
if(Place(8))
{
PrintResult();
}
else
{
Queen[8]=0;
}
}
}
public static void main(String[] args)
{
Test test=new Test();
//test.Queens(); //这句是求解所有的解
test.ShiYan(); //这句是实验要求,已知几个皇后的位置,求是否可以在第八行放入一个皇后
}
}
程序代码import java.math.*;
import java.io.*;
public class Test {
static int N=8;
private int[] Queen=new int[N+1];
private int _ResultCount;
public Test()
{
_ResultCount=0;
for(int i=1;i<=N;i++)
{
Queen[i]=0;
}
}
private boolean Place(int k)
{
for(int i=1;i<k;i++)
{
if(Queen[i]==Queen[k] || Math.abs(Queen[i]-Queen[k])==Math.abs(i-k))
{
return false;
}
}
return true;
}
private void PrintResult()
{
_ResultCount++;
System.out.print("第"+_ResultCount+"组解是:");
for(int i=1;i<=N;i++)
{
System.out.print(Queen[i]+" ");
}
System.out.println();
}
private void Queens()
{
int k=1;//Queen[k]=0; //k表示的是第几行 Queen[k]表示的是第k行的皇后放在的列数
while(k>=1)
{
Queen[k]++;
while(Queen[k]<=N && Place(k)==false)
{
Queen[k]++; //寻找该行可放皇后的位置
}
if(Queen[k]<=N) //如果找到了可以放皇后的位置
{
if(k==N) //如果全部的位置都已经放好了皇后,则输出解
{
PrintResult();
}
else //向下搜索
{
k++;
}
}
else
{
Queen[k]=0; //恢复前面的值,重要
k--; //回溯 ,在该行不能放皇后的情况下
}
}
}
///实验,已知几个皇后的位置,求是否可以在第八行放入一个皇后
private void ShiYan()
{
Queen[1]=4;
Queen[2]=6;
Queen[3]=8;
Queen[4]=2;
Queen[5]=7;
Queen[6]=1;
Queen[7]=3;
for(int i=1;i<=N;i++)
{
Queen[8]=i;
if(Place(8))
{
PrintResult();
}
else
{
Queen[8]=0;
}
}
}
public static void main(String[] args)
{
Test test=new Test();
//test.Queens(); //这句是求解所有的解
test.ShiYan(); //这句是实验要求,已知几个皇后的位置,求是否可以在第八行放入一个皇后
}
}
[本日志由 随风 于 2007-07-05 03:31 PM 编辑]
文章来自: 本站原创
引用通告地址: http://www.fenglog.com/blog/trackback.asp?tbID=275
Tags: 八皇后 Java 算法 回溯
文章来自: 本站原创
Tags: 八皇后 Java 算法 回溯 评论: 0 | 引用: 0 | 查看次数: 4394
发表评论
订阅
上一篇
下一篇