zoukankan      html  css  js  c++  java
  • n皇后问题

    原理很简单

    #include <iostream>
    using namespace std;
    
    int x[20]; //解向量
    int sum; //可行方案个数
    int n;
    
    //在第t列是否可放置
    bool place(int t){
    	int i;
    	for(i=1; i<t; i++)
    		//如果 行-行 == 列-列 或者 在同一列。
    		if(abs(t-i) == abs(x[t]-x[i]) || x[i]==x[t])
    			return false;
    	return true;
    }
    
    //回溯,即递归调用
    void backtrack(int t){
    	//cout << t << endl;
    	int i;
    	//到达最后一行,即找到所有解
    	if(t > n){
    		sum++;
    		for(i=1; i<=n; i++)
    			printf(" %d",x[i]);
    		printf("
    ");
    	}else{
    		//从第一行第一列开始,循环到 第一行 第n列
    		for(i=1; i<=n; i++){
    			x[t] = i; //对于第t行,第i列,放置皇后.
    
    			//判断刚才放置的位置(x[t] = i)是否可行,如果可行,就放置下一行。
    			//不可行的话,继续在第t行放置
    			if(place(t))  backtrack(t+1);
    		}
    	}
    }
    int main(){
    	while(cin >> n){
    		backtrack(1); //从第1行开始
    		cout << "方案数:" <<sum << endl; //可行解个数
    	}
    	
    	return 0;
    }


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    数据结构
    java web
    C++
    SQL(结构化查询语言)
    网站协议
    python
    爬虫
    select 多选
    List 去除重复数据的五种方式
    oracle锁表SID查询
  • 原文地址:https://www.cnblogs.com/vintion/p/4116946.html
Copyright © 2011-2022 走看看