一次暴力穷举解八皇后问题的血腥尝试(心疼我的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);
}
}

时间: 2024-07-31 17:07:07

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

暴力回溯法 解八皇后

国际象棋 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. public class _8Queen { //回溯法,暴力解8皇后 private static int ways = 0; //返回解法个数 public static int f8queen() { int[][] board = new int

暴力穷举

暴力除法 题目描述 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79 输入 输入包括多行,每行一个正整数n,2<=n<=79 输出 针对每个输入的n,从小到大输出该表达式,若没有表达式可以生成,则不输出. 样例输入 62 样例输出 79546/01283=62 94736/01528=62 #include<iostream> #include<string.h> using

用遗传算法解八皇后问题

此算法收敛速度还可以,基本在1万代之内就能找到解 主程序 clear; clc; %% %八皇后问题,8X8的棋盘上,放置8个皇后,使之两两都不能攻击 %初始的状态,随机在棋盘上放置8个皇后,每列放一个 n = 8; %8皇后 %% %用遗传算法计算 %先随机获得几个个体,形成一个种群 %这个种群有10个个体 No_of_people = 10; people = randi(n,[No_of_people,n]); %计算每个初始种群的h值 people_h = ones(No_of_peop

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

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

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

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502622 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在发点代码. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofei-it/Algorithms 绝大部分算法都是我自己写的,没有参考网上通用代码.读者可能会觉得有的代码晦涩难懂,因为那是我自己的理解. 最近几天都是在写一些原来的东西

暴力穷举zip压缩文件的密码

生成密码的方式类似与时钟,末尾遍历完了第k位所有的字符,就让第k位的前一位到下一位字符,第k位回到第0个字符. 对python还不太熟悉,效率比较低,但是能破解简单的密码. import zipfile #密码可能有的字符 testSetstr = "w.abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#$%&'()*+,-/:;<=>[email protected][\]^_`{|}~"

【算法学习笔记】49.暴力穷举 BFS 剪枝 SJTU OJ 1357 相邻方案

相邻方案 Description 有一个5*5的矩阵,每个元素只可能是H或者J. 我们现在需要选择7个相邻的格子使得H的数量小于J的数量.其中,拥有公共边的两个格子可以被称为相邻的格子. 对于任意一种输入的5*5矩阵,请输出满足上述条件的方案总数. Input Format 共5行,表示矩阵情况.(每一个元素只可能是H或J) Output Format 一个整数N,代表不相同方案的总数. Input Sample HHHHH JHJHJ HHHHH HJHHJ HHHHH Output Samp

bitmap解八皇后问题

为什么是这么做的? 1 void backtracking(int row, int n, int left, int right, int col, int &count) 2 { 3 if (row == n) 4 { 5 count++; 6 } 7 int bits = (~(col | left | right))&((1 << n) - 1); 8 9 while (bits) 10 { 11 int bit = -bits & bits; 12 backt

基于NVIDIA GPU的MD5加速穷举(CUDA)

声明:本文仅限于技术分享,请勿将代码用于非法用途,利用本文代码所产生的各种法律问题,与本文作者无关. 1. 摘要: MD5为非常普遍使用的消息摘要算法,很多应用系统采用该算法加密密码,在计算文件摘要值以验证文件是否被篡改方面也普遍使用, MD5服务安全方面很多年,随着计算机技术的发展,该算法已经很不安全,穷举遍历的代价也变得没那么高,笔者建议至少采用(SHA1+盐值) 方法加密新建设的应用系统,由于目前很多网站大量的用户名密码泄露,个人的信息安全也越来越重要,目前很多系统采用的加密算法有: 1>