Problem B: 皇后问题
Time Limit: 4 Sec Memory Limit: 128 MB
Submit: 21 Solved: 8
Description
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
现在后宫是N*N棋盘,有N个皇后,问有多少种摆法让她们互相不攻击。
Input
第一行数据组数,不大于100。
接下来每行一个数N。N不超过14
Output
每组数据1行。
Sample Input
2
2
8
Sample Output
0
92
/*
如果遇到这种题目,应该果断达打表吧。。数据很小 《=14;
注意的是,每一行每一列每一斜符合条件都一定仅有一个皇后 。。
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#define manx 16
using namespace std;
int n,sum;
bool mp[manx][manx];
bool judge(int x,int y){
for(int i=1;i<=x-1;i++) if(mp[i][y]) return 1;
for(int i=x-1,j=y-1; i>=1 && j>=1; i--,j--)
if(mp[i][j]) return 1;
for(int i=x-1,j=y+1; i>=0 && j<=n; i--,j++)
if(mp[i][j]) return 1;
return 0;
}
void dfs(int x,int temp){
if(x>n){
if(temp==n) sum++;
return ;
}
for(int i=1;i<=n;i++){
if(!judge(x,i)){
mp[x][i]=1;
dfs(x+1,temp+1);
mp[x][i]=0;
}
}
return ; / 每行都要有一个皇后。。。
}
int main(){
int t;
cin>>t;
while(t--){
sum=0;
cin>>n;
memset(mp,0,sizeof(mp));
for(int i=1;i<=n;i++){
mp[1][i]=1;
dfs(2,1);
mp[1][i]=0;
}
cout<<sum<<endl;
}
}
/*
得到结果。。。
mp[15]={0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596}
打表做吧 。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define manx 16
using namespace std;
int mp[15]={0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596};
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
cout<<mp[n]<<endl;
}
}
*/
Problem B: 皇后问题
Time Limit: 4 Sec Memory Limit: 128 MBSubmit: 21 Solved: 8
Description
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
现在后宫是N*N棋盘,有N个皇后,问有多少种摆法让她们互相不攻击。
Input
第一行数据组数,不大于100。
接下来每行一个数N。N不超过14
Output
每组数据1行。
Sample Input
2
2
8
Sample Output
0
92
/* 如果遇到这种题目,应该果断达打表吧。。数据很小 《=14; 注意的是,每一行每一列每一斜符合条件都一定仅有一个皇后 。。 */ #include<iostream> #include<cstdio> #include<algorithm> #define manx 16 using namespace std; int n,sum; bool mp[manx][manx]; bool judge(int x,int y){ for(int i=1;i<=x-1;i++) if(mp[i][y]) return 1; for(int i=x-1,j=y-1; i>=1 && j>=1; i--,j--) if(mp[i][j]) return 1; for(int i=x-1,j=y+1; i>=0 && j<=n; i--,j++) if(mp[i][j]) return 1; return 0; } void dfs(int x,int temp){ if(x>n){ if(temp==n) sum++; return ; } for(int i=1;i<=n;i++){ if(!judge(x,i)){ mp[x][i]=1; dfs(x+1,temp+1); mp[x][i]=0; } } return ; / 每行都要有一个皇后。。。 } int main(){ int t; cin>>t; while(t--){ sum=0; cin>>n; memset(mp,0,sizeof(mp)); for(int i=1;i<=n;i++){ mp[1][i]=1; dfs(2,1); mp[1][i]=0; } cout<<sum<<endl; } } /* 得到结果。。。 mp[15]={0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596} 打表做吧 。。。 #include<iostream> #include<cstdio> #include<algorithm> #define manx 16 using namespace std; int mp[15]={0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596}; int main(){ int t,n; cin>>t; while(t--){ cin>>n; cout<<mp[n]<<endl; } } */