cange


私信TA

用户名:cange

访问量:615

签 名:

等  级
排  名 33702
经  验 410
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 清华大学
专  业

  自我简介:

解题思路:
用c++的全排列,先求出单个n皇后的所以解,再数学的C(count)取二减去一些有重复的列,因为不能同时放在同一个地方,最后再乘以2,因为两种方法可以互调。
注意事项:

参考代码:

#include<bits/stdc++.h>

using namespace std;


int a[11];

int sits[8][8];

int main(){

int n;

cin>>n;

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

cin>>sits[i][j];

}

}

for(int i=1;i<=n;i++){

a[i-1]=i;

}

int count=0; 

vector<vector<int> > all;

vector<int> tmp;

tmp.resize(n);

do

{

bool flag=true;

for(int j=0;j<n;j++){

if(sits[a[j]-1][j]==0){

flag=false;

}

}

for(int i=0;i<n;i++){

for(int j=i+1;j<n;j++){

if(abs(i-j)==abs(a[i]-a[j])){

flag=false;

}

}

}

if(flag){

count++;

for(int i=0;i<n;i++){

tmp[i]=a[i];

}

all.push_back(tmp);

}while(next_permutation(a,a+n));

int subcount=0;

for(int i=0;i<count;i++){ //每一行 

tmp=all[i];

for(int j=i+1;j<count;j++){ //下一个比较 

for(int k=0;k<n;k++){ //每一列 

if(tmp[k]==all[j][k]){

subcount++;

break;

}

}

}

}

cout<<2*(count*(count-1)/2-subcount);


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区