zoukankan      html  css  js  c++  java
  • 数据结构——八皇后递归解法

    代码来源:https://www.cnblogs.com/houkai/p/3480940.html

    参考代码:(注解多为自己填写)

    #include <iostream>
    #include <stdlib.h> 
    using namespace std;
    //k为第几行,a[k]为第几列  
    bool check_2 (int a[],int n)
    {
        for(int i=1;i<=n-1;i++)//依次判断n行之前的皇后是否与n行皇后冲突 
        {
            if((abs(a[i]-a[n])==n-i)||(a[i]==a[n]))//对角线不相等且不在同一列 
                return false;
        }      
        return true;
    }
    
    int a[100], n, count;
    void backtrack(int k)
    {
        if (k>n)//当k=n+1时找到解
        {
            for(int i=1;i<=8;i++)  
            {
                //cout<<a[i];
            }
            //cout<<endl;
            count++;
        }
        else
        {
            for (int i = 1;i <=n; i++)//找不到合适的列(位置),回到上一行 
            {
                a[k] = i;  //依次寻找适合的列 
                if (check_2(a,k) == 1)//当前皇后的位置符合要求,则求下一个皇后 
                {backtrack(k+1);}  //递归调用,进入下一行(即下一个皇后) 
            }
        }
        
    }
    
    int main()
    {
        n=8,count=0;
        backtrack(1);//从第一行开始 
        cout<<count<<endl;
    }
    

    某道程序填空题修改后结果:

    //求解N 皇后问题
    #include <stdio.h>
    #include <stdlib.h>
    
    #define  N  20	//最多皇后个数
    int q[N];	//存放各皇后所在的列号,即(i,q[i])为一个皇后位置
    int  count  =  0;	//累计解个数
    void  dispasolution(int  n)	//输出n 皇后问题的一个解
    {
    	printf("	第%d 个解:", ++count);
    	for(int i = 1; i <= n; i++)
    		printf("(%d,%d) ", i, q[i]);
    	printf("
    ");
    }
    
    //i代表行,j代表列
    bool place(int i, int j)	//测试(i,j)位置能否摆放皇后
    {
    	int k=1;
    	if(i == 1)
    		return  true;	//第一个皇后总是可以放置int k = 1;
    	while(   k<=i-1 	)  {//1	//k=1~i-1 是已放置了皇后的行
    		if((q[k] ==  j	) ||  (abs(q[k] - j))==  i-k	)//2 3
    			return false;
    		k++;
    	}
    
    	return true;
    
    }
    void  queen(int  i,  int  n)	//放置 1~i 的皇后
    {
    	if( i>n	)//4
    		dispasolution(n);	//所有皇后放置结束
    	else {
    		for(int j =  1; j <=  n;  j++)		//在第i 行上试探每一个列j
    			if(place(i,  j)) {
    				//在第i 行上找到一个合适位置(i,j)
    				q[i]=j	;//5
    				queen(i+1, n)	;//6
    			}
    
    	}
    
    }
    
    int  main()
    
    {
    	int  n;	//n 为存放实际皇后个数
    	printf(" 皇后问题(n<20) n=");
    	scanf("%d",  &n);
    	if(n > 20)
    		printf("n 值太大,不能求解
    ");
    	else {
    		printf("%d 皇后问题求解如下:
    ", n);
    		queen(1,  n);	//放置 1~i 的皇后
    	}
    
    }
    

    自己参考后用c写的,但有错误,暂时还不知道为什么错

    #include <stdio.h>
    #include <stdlib.h>
    int i,n,count,a[100];
    int check(int a[],int n)
    {
    	for(i=1;i<=n-1;i++)
    	{
    		if((abs(a[n]-a[i])==n-i)||(a[n]==a[i]))
    		return 0;
    	}
    	return 1;
    }
    void recursion(int k)
    {
    	if(k>n)
    	{
    		printf("111
    ");
    		count++;
    	}
    	else
    	{
    		for(i=1;i<=n;i++)
    		{
    			a[k]=i;
    			if(check(a,k)==1)
    			{ recursion(k+1);
    					printf("111
    ");
    			}
    		}
    	}
    }
    int main()
    {
    	n=8;
    	count=0;
    	printf("%d",count);		
    	recursion(1); 
    	printf("%d",count);	
    } 
    
  • 相关阅读:
    下载视频
    009 逻辑 + MFC CString
    008 浅拷贝与深拷贝
    007 operator
    006 this指针原理
    005 逻辑 + STL list
    004 list::sort
    003 逻辑 + mfc CList
    001 C++历史和思想
    并查集模板
  • 原文地址:https://www.cnblogs.com/vivid-victory/p/10090468.html
Copyright © 2011-2022 走看看