N皇后非递归实现

N皇后非递归实现

马上上课了,以后有时间再细说。。。。。。

回溯:(偷个懒,从老师ppt上拷过来)

状态树(解空间树)

回溯法的求解过程实质上是一个先序遍历一颗状态树的过程,只是这棵状态树不是预先建立的,而是隐含在遍历过程中。

(可以通过画一个四皇后的解空间树来很嗨的理解,理解回溯的过程,图片有时间就更)

约束函数

节点与解

完全解

分解,继续搜索

死节点,回溯

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int numsum=0;//记录摆法个数 
bool check(int arr[],int k){//检查当前点是否合格 
	for(int i=1 ; i<k ; i++){
		if(arr[i] == arr[k] || abs(arr[i]-arr[k]) == k-i)return false;
	}
	return true;
}
int print(int arr[],int n){//打印输出序列 
	for(int i=1;i<=n;i++){
		cout<<arr[i]<<" ";
	}
}
int main(){
	int n;
	cout<<"请输入皇后数量:"; 
	cin>>n;//输入n皇后 
	int arr[100]={0};//a[1~n]存放可以取的值 	
	int k=1;
	while(k>=1){
		while(arr[k]<n){
			arr[k]++;
			if(check(arr,k)&& k==n){//完全解 
				cout<<"第"<<++numsum<<"种"<<"  ";
				arr[0]++;
				print(arr,n);
				cout<<endl;
			}
			else if(check(arr,k)){//部分解 
				k++;
			}
			//既不是完全解,也不是部分解,就试探a[k]的其他取值,依次往后面遍历 
		}
		//死结点,回溯 
		arr[k]=0;
		k--;
	}
	cout<<"共有:"<<numsum<<"种摆法"<<endl;
	return 0;
}

java版本


import java.util.Scanner;

public class Queue {

    public static boolean check(int[] arr,int k){

        for (int i = 1; i < k ; i++) {
            if(arr[i] == arr[k] || Math.abs(arr[i]-arr[k]) == k-i){
                return false ;
            }
        }
        return true;
    }

    public static void print(int[] arr,int n){

        for (int i = 1; i <= n; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = new int[100];
        int n = 4;//棋子数量
        int k = 1;
        System.out.print("insert target num:");
        n = new Scanner(System.in).nextInt();
        while( k >= 1 ){
            while( arr[k] < n ){
                arr[k]++;
                if( check(arr,k) && k == n){
                    System.out.println("第"+(++arr[0])+"种");
                    print(arr,n);
                }
                else if(check(arr,k)){
                    k++;
                }
            }
            arr[k] = 0;
            k--;
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值