bailian 2754八皇后
Description
會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數(shù)地吃掉其他棋子。
如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。?
?
對于某個滿足要求的8皇后的擺放方法,定義一個皇后串a(chǎn)與之對應,即a=b1b2...b8,其中bi為相應擺法中第i行皇后所處的列數(shù)。
已經(jīng)知道8皇后問題一共有92組解(即92個不同的皇后串)。 給出一個數(shù)b,要求輸出第b個串。
串的比較是這樣的:皇后串x置于皇后串y之前,當且僅當將x視為整數(shù)時比y小。
?
Input
第1行是測試數(shù)據(jù)的組數(shù)n,后面跟著n行輸入。每組測試數(shù)據(jù)占1行,包括一個正整數(shù)b(1 <= b <= 92)
?
Output
輸出有n行,每行輸出對應一個輸入。輸出應是一個正整數(shù),是對應于b的皇后串。
?
Sample Input
2 1 92Sample Output
15863724 84136275 #include <iostream> #include <cmath> using namespace std; int a[10],m; int ans[100][10]; void dfs(int k) {int i,j,x,y,flag;if(k==8){ for(i=0;i<k;i++) ans[m][i]=a[i];m++;}else { for(i=1;i<=8;i++){ flag=1;for(j=0;j<k;j++)if(k==j||i==a[j]||abs(j-k)==abs(a[j]-i)) flag=0;if(flag){a[k]=i; dfs(k+1);} }} } int main(int argc, char *argv[]) {int n,i,j,t;m=1;dfs(0);cin>>t;while(t--){ cin>>n;for(i=0;i<8;i++) cout<<ans[n][i];cout<<endl;}return 0; } View Code?
#include <iostream>
#include <cmath>
using namespace std;
int a[10],m;
int ans[100][10];
void dfs(int k)
{
?int i,j,x,y,flag;
?if(k==8)
?{?for(i=0;i<k;i++) ans[m][i]=a[i];
??m++;
?}
?else
?{?for(i=1;i<=8;i++)
??{?? flag=1;
???for(j=0;j<k;j++)
????if(k==j||i==a[j]||abs(j-k)==abs(a[j]-i)) flag=0;
???if(flag)
???{
????a[k]=i; dfs(k+1);
???}???
??}
?}
}
int main(int argc, char *argv[])
{
?int n,i,j,t;
?m=1;
?dfs(0);
?cin>>t;
?while(t--)
?{?cin>>n;
??for(i=0;i<8;i++) cout<<ans[n][i];
??cout<<endl;
?}
?return 0;
}
#include <iostream> #include <cmath> using namespace std; int m,n,a[10],s,xx; void DFS(int n) { int i,k,ok; if(n==8) {s++; if(s==xx) {for(i=0;i<7;i++) cout<<a[i];}}else{for(i=1;i<=8;i++){ ok=1;for(k=0;k<n;k++)if(i==a[k]||(abs(n-k)==abs(i-a[k]))) ok=0 ;if(ok){ a[n]=i; DFS(n+1);}}}} int main() { int i,k,x1,y1;cin>>n;while(n--){s=0;cin>>xx;DFS(0);} } View Code
#include <iostream>
#include <cmath>
using namespace std;
int m,n,a[10],s,xx;
void DFS(int n)
{ int i,k,ok;
if(n==8) {s++; if(s==xx) {for(i=0;i<7;i++) cout<<a[i];}}
 else
 {
 for(i=1;i<=8;i++)
 { ok=1;
 for(k=0;k<n;k++)
 if(i==a[k]||(abs(n-k)==abs(i-a[k]))) ok=0 ;
 if(ok){ a[n]=i; DFS(n+1);}
 }
 }
}
int main()
{ 
 int i,k,x1,y1;
 cin>>n;
 while(n--)
 {s=0;
 cin>>xx;
 DFS(0);
 }
}
#include <iostream> #include <cmath> using namespace std; int m,n,a[10],s,xx; void DFS(int n) { int i,k,ok; if(n==8) {s++; if(s==xx) {for(i=0;i<7;i++) cout<<a[i]; cout<<a[7]<<endl; xx=0;} }else{for(i=1;i<=8;i++){ ok=1;for(k=0;k<n;k++)if(i==a[k]||(abs(n-k)==abs(i-a[k]))) ok=0 ;if(ok){ a[n]=i; DFS(n+1);}}}} int main() { int i,k,x1,y1;cin>>n;while(n--){s=0;cin>>xx;DFS(0);} } View Code
?
#include <iostream>
#include <cmath>
using namespace std;
int m,n,a[10],s,xx;
void? DFS(int n)
{??? int i,k,ok;
if(n==8) {s++; if(s==xx) {for(i=0;i<7;i++) cout<<a[i]; cout<<a[7]<<endl; xx=0;}
}
?else
?{
??for(i=1;i<=8;i++)
??{??? ok=1;
???for(k=0;k<n;k++)
????if(i==a[k]||(abs(n-k)==abs(i-a[k]))) ok=0 ;
????if(ok){ a[n]=i; DFS(n+1);}
??}
?}
?
}
int main()
{?????
?int i,k,x1,y1;
?cin>>n;
?while(n--)
?{s=0;
?cin>>xx;
?DFS(0);
?}
}
???
#include<iostream> #include<algorithm> using namespace std; int dp[100][10],total = 1,a[10]; bool ok( int k,int i) { for (int j = 0; j < k; j++) if ( a[j]== i || abs(a[j]-i)==abs(j-k) ) return false; return true; } void dfs(int k) { if (k==8){ for (int i=0; i< 8; i++) {dp[total][i] = a[i];}total++;}elsefor (int i=1; i<=8; i++)if ( ok(k,i) ) { a[k]=i; dfs(k+1); } }int main() {int t,n;dfs(0);cin>>t;while(cin>>n){int i;for(i = 0; i < 8; i++)cout<<dp[n][i];cout<<endl;}return 0; } View Code
#include<iostream>
#include<algorithm>
using namespace std;
int dp[100][10],total = 1,a[10];
bool ok( int k,int i)
{? for (int j = 0; j < k; j++)????????????? 
????? if (? a[j]== i? ||? abs(a[j]-i)==abs(j-k) )????????????? 
???????? return false;???????? 
?? return true;
}
void? dfs(int k)
{?? if? (k==8)
??? {?? for (int i=0; i< 8; i++) 
??{
???dp[total][i] = a[i];
??
??}
????? 
??total++;
??? }
??? else
??????? for (int i=1; i<=8; i++)
??????????? if ( ok(k,i) ) 
???{ a[k]=i;??? dfs(k+1); }
}
int main()
{
??? int t,n;
?dfs(0);
?cin>>t;
?while(cin>>n)
?{
??int i;
??for(i = 0; i < 8; i++)
???cout<<dp[n][i];
??cout<<endl;
?}
??? return 0;?? 
}
轉(zhuǎn)載于:https://www.cnblogs.com/2014acm/p/3888292.html
總結(jié)
以上是生活随笔為你收集整理的bailian 2754八皇后的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 爱要大声“手”出来!一个程序猿的七夕表白
- 下一篇: 计组之总线:4、总线标准
