一次暴力穷举解八皇后问题的血腥尝试(心疼我的CPU)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次暴力穷举解八皇后问题的血腥尝试(心疼我的CPU)相关的知识,希望对你有一定的参考价值。

还没有接触到系统的算法课程,在JAVA教材看到了八皇后的题目。之前对于算法,我一直存在这一种偏见-----计算机的运算速度那么快有必要花费脑筋设计各种算法吗?(用暴力穷举不就好了?)。然而当我解八皇后问题时,我的core-i5跑了半个小时接近跑完所有92个解,此处心疼本人cpu三秒。(为什么会这样,原因很简单:暴力穷举的话可能的情况数目是64*63*62*61*60*59*58*57=178462987637760种,即使电脑运算速度再快,也需要相当长的时间)

至此我初步体会到了算法的重要性---它是cpu的守护神。

附下图片和源代码:

技术分享

技术分享

 

package chapter4_pratice;

public class pratice {
public static void display(boolean [][]a)
{
for(int i=0;i<8;i++)
{System.out.println(" +---+---+---+---+---+---+---+---+ ");
for(int k=0;k<8;k++)
{
if(a[i][k])System.out.print(" | "+‘Q‘);
else System.out.print(" | ");
}
System.out.print(" |");
System.out.println();
}
System.out.println(" +---+---+---+---+---+---+---+---+ ");
}
public static boolean line(boolean [][]a)
{int count;
for(int i=0;i<8;i++)
{count=0;
for(int j=0;j<8;j++)if(a[i][j])count++;
if(count>=2)return false;
}
return true;
}
public static boolean column(boolean [][]a)
{int count;
for(int i=0;i<8;i++)
{count=0;
for(int j=0;j<8;j++)if(a[j][i])count++;
if(count>=2)return false;
}
return true;
}
public static boolean diagonal(boolean a[][])
{
for(int i=0;i<7;i++)
{
int count=0;
int co=0;
for(int k=0;k<8-i;k++)
{
if(a[i+k][co+k])count++;
}
if(count>=2)return false;
}
for(int i=1;i<8;i++)
{
int count=0;
int co=0;
for(int k=0;k<i+1;k++)
{
if(a[i-k][co+k])count++;
}
if(count>=2)return false;
}
for(int i=1;i<8;i++)
{
int count=0;
int co=7;
for(int k=0;k<i+1;k++)
{
if(a[i-k][co-k])count++;
}
if(count>=2)return false;
}
for(int i=0;i<7;i++)
{
int count=0;
int co=7;
for(int k=0;k<8-i;k++)
{
if(a[i+k][co-k])count++;
}
if(count>=2)return false;
}
return true;
}
public static boolean perfect(boolean a[][])
{
if(line(a)&&column(a)&&diagonal(a))return true;
else return false;
}
public static void init(boolean a[][])
{
for(int i=0;i<8;i++)for(int j=0;j<8;j++)a[i][j]=false;
}
public static void set(int m,boolean a[][])
{
int i=m/8;int j=m%8;
a[i][j]=true;
}
public static void combine(int n,int m,int a[],int b[],int M,boolean array[][])

{

for(int j=n;j>=m;j--)

{

b[m-1]=j-1;

if(m>1)combine(j-1,m-1,a,b,M,array);//用到了递归思想

else

{
for(int k=7;k>=0;k--)
{
set(a[b[k]]-1,array);
}
if(perfect(array)){display(array);System.out.println("\\n\\n");

}
init(array);

}

}

}
public static void fill(boolean a[][])
{
int c[]=new int[64];int b[]=new int[8];
for(int i=0;i<64;i++)c[i]=i+1;
combine(64,8,c,b,8,a);
}
public static void main(String args[])
{
boolean a[][]=new boolean[8][8];
System.out.println("八皇后问题的所有解为:");
fill(a);
}
}

 

















































































































以上是关于一次暴力穷举解八皇后问题的血腥尝试(心疼我的CPU)的主要内容,如果未能解决你的问题,请参考以下文章

暴力穷举和回溯法(八皇后问题)

回溯算法解八皇后问题(java版)

每天刷个算法题20160519:回溯法解八皇后

每天刷个算法题20160519:回溯法解八皇后

每天刷个算法题20160519:回溯法解八皇后

Python用迭代(yield)和递归解决八皇后问题