八皇后算法问题

问题描述

问题是下面算法,为什么得不到真确结果?publicclassTest{publicstaticintn=8;//棋盘行列数publicstaticintcount=0;//皇后解法个数publicstaticQueen[]stack=newQueen[n];//皇后栈publicstaticinttop=0;//栈顶//利用栈publicstaticvoidsearch3(){//cur行if(top==n){count++;}else{for(inti=0;i<n;i++){//顺序尝试放在cur行的i列booleanOk=true;for(intj=0;j<top;j++){//判断是否与前面放置的皇后冲突if(stack[j].row==top||stack[j].col==i||stack[j].col+stack[j].row==top+j||stack[j].col-stack[j].row==top-j){Ok=false;break;}}if(Ok){//如果不冲突stack[top]=newQueen(top,i);top++;System.out.println(top);search3();top--;}}}}publicstaticvoidmain(String[]args){search3();System.out.println(count);}

解决方案

解决方案二:
都是一个套路懒得看了,我翻了一下以前写的代码,可以参考一下。#include<iostream>#include<stdlib.h>#include<fstream>usingnamespacestd;voidOutput();voidEightQueen(int);intICount=0;//记录方案个数intWeiZhi[9];//记录棋子位置int_tmain(intargc,_TCHAR*argv[]){cout<<"八皇后问题求解:"<<endl;EightQueen(0);//求解cout<<endl<<"一共有"<<ICount<<"种解法"<<endl<<endl;system("pause");return0;}voidOutput()//输出函数{cout<<endl<<"第"<<++ICount<<"种方案:"<<endl;cout<<"0";for(inti=0;i<8;i++)//输出棋盘行号码{cout<<""<<i+1;}cout<<endl;for(inti=0;i<8;i++){cout<<""<<i+1<<"";//列号码for(intj=0;j<8;j++){if(WeiZhi[i]-1==j)//如果Weizhi存储的位置等于列号输出棋子{cout<<"■";//输出皇后}else{cout<<"□";//输出棋盘}}cout<<endl;}cout<<endl;}voidEightQueen(intn){boolsafe=1;//是否冲突,0为冲突,1为安全if(n==8)//若8个皇后放置完毕{Output();//输出结果return;}for(inti=1;i<=8;i++)//试探{WeiZhi[n]=i;//在该列第i行放置safe=1;//判断第n个皇后是否与前边的皇后形成冲突for(intj=0;j<n;j++){if((WeiZhi[j]==WeiZhi[n])||(abs(WeiZhi[j]-WeiZhi[n])==(n-j)))//形成攻击{safe=0;}}if(safe==1)//没有冲突就试探下一列{EightQueen(n+1);//递归调用}}}

时间: 2025-01-26 17:21:40

八皇后算法问题的相关文章

javascript递归回溯法解八皇后问题

  javascript递归回溯法解八皇后问题:           网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下. 下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

常用算法:C#八皇后问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型应用.八皇后问题就是棋盘上的8个皇后不能在同一行.一列或一条斜线上,在8!=40320种排列中共有92种解决方案.代码如下: using System; using System.Collections.Generic; using System.Text;namespace ExQueen { class Queen { public void QueenArithmetic(int size){ int[] Queen = new int[s

递归-(已解决)自己用java写的八皇后问题算法,可是不行,求告知原因

问题描述 (已解决)自己用java写的八皇后问题算法,可是不行,求告知原因 public class Test { public static void main(String[] args) { Empress a=new Empress(); a.find(0,0); System.out.println(a.map); } } class Empress{ public int[][] arry=new int[8][8]; public int map=0; public boolean

【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

        八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想到的就是遍历穷举法,不过仔细一想,思路虽然非常清晰,但是需要遍历次数太多,时间复杂度很高.那么,我们应该怎么办呢?下面给出算法思路:         算法思想:首先尝试在第一行放置第一个皇后,然后在第二行放置第二个使之与前面的皇后不构成威胁,依此类推.如果发现不能放置下一个皇后,就回

算法-八皇后 递归方法 遇到奇怪问题。。。

问题描述 八皇后 递归方法 遇到奇怪问题... record[0][0] 未被赋值的情况下,前后两次查看,值不一样,运行结果的前两行即是record[0][0],一次是1,一次是0 #include<stdio.h> #include<stdlib.h> int control[8][8]={0}; int record[92][8]={0}; int count=0; int floor=1; int tmp[8]; int p; void setControlArea(int

UVa 639:Don&#039;t Get Rooked, 类八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580 题目类型: 暴力, 回溯法 题目: In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this p

基于Delphi的八皇后问题动态实现

摘要 对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象.更生动,使教学能产生良好的效果. 关键词 八皇后问题 冲突 数据结构 线程类 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 下面用delphi6实现的八皇后问题的动态图形程序,能够演示全部的92组解.八皇后问题动态图形的实现,主要应解决以下

python 八皇后中的列表问题

问题描述 python 八皇后中的列表问题 我这里写了一个简单的八皇后程序,用的是最笨的算法,大家就不要吐槽我的算法了,问题是我的保存所有解法的总列表不正常,列表中所有元素都一样,劳烦大家看下问题出在哪 import time import os def check(list_): #这个函数用来检查当前位置是否合法 for i in range(0,len(list_)-1): if len(list_)==1 : continue for j in range(i+1,len(list_))

面试题:八皇后问题(N皇后问题)

前言 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?这道题目也可以稍微延伸一下,变为 N×N的棋盘上放置N个皇后,其他条件相同. 下面介绍一种比较简单易懂的实现方式. 项目下载地址 正文 算法 先说一下算法, 这里使用的是一个改良版的广度优先搜索算法.在N×N的棋盘上,我们先在第一行的第一个位置放置下皇后,接着我们就不去管第一行了,因为第一行已经不能放置皇后了.我们在第二行找到所有的可以放置皇后的位置.同理我们