我就是那个辣鸡题解的作者
查看原帖
我就是那个辣鸡题解的作者
21609
封禁用户楼主2016/9/13 20:38

我知道楼下你们都没看懂 他用了位运算和递推 反正你们都喜欢copy 你们就看一下楼下的吧 本人这个只适用于较小数据 下面是那个丧心病狂的数据以及被我修过的程序(然而修了并没有什么用)

输入 13 输出 1 3 5 2 9 12 10 13 4 6 8 11 7

1 3 5 7 9 11 13 2 4 6 8 10 12

1 3 5 7 12 10 13 6 4 2 8 11 9

73712

#include <iostream> 
#include <cstdio>
#include <cmath>
using namespace std;
int x[2000000];
bool is_ok(int k){     //这是一个判断自己要放得皇后是否与前面冲突的函数 
     int i=1;
     while (i<k){      //k就是你现在放到哪一个皇后了 
         if (x[i]==x[k] || fabs(x[i]-x[k])==fabs(i-k)) 
             return false;
         i++;   
     }
     return true;    
}
int main() {    
    int t=1,n,k,total=0,i;
    cin>>n;
    x[1]=0;k=1 ;
    while (k>0){                 //21~33是主要程序 
        x[k]++;                     //先穷举一个位置 
        while (x[k]<=n && !is_ok(k))   x[k]++;     //如果不能放就一直++ 直到可以或 
        if(x[k]<=n)                                 //这个皇后不能放 
            if(k==n){                            //如果放到第n个皇后了 总数++ 
                total++;
                if (total<=3){
                    for (i=1;i<=n;i++)
                        cout<<x[i]<<' ';
                    cout<<endl; 
                }
            }
            else {                                   //如果这个皇后成功放下来 就尝试放下一个皇后 
                k++;
                x[k]=0;                            //一定要清零!!! 
            }
       else 
            k--;                                   //放不下来就回溯 
    }       //这里打出所有方法是在有一个方法后强制让他回溯 就能产生第二种格局 
    cout<<total;                                   //打印总数 
    return 0;
}
2016/9/13 20:38
加载中...