P1219 八皇后
阿新 • • 發佈:2018-12-10
#include<bits/stdc++.h> using namespace std; int n; int cnt=0; vector<int> temp; int c[100]={};//行 int d[100]={};//正對角線 int b[100]={};//負對角線 void dfs(int index){ if(index==n+1){ cnt++; if(cnt<=3){ for(int i=1;i<=n;i++){ if(i==1) cout<<temp[i]; else cout<<' '<<temp[i]; } cout<<endl; } return; } for(int i=1;i<=n;i++){ //int flag=1; //temp[index]=i; /*for(int j=1;j<index;j++){ if(temp[index]==temp[j]||abs(temp[index]-temp[j])==abs(index-j)){ flag=0;break; } } if(flag==1) dfs(index+1);*/ if(c[i]==0&&d[index+i]==0&&b[index-i+n]==0){ temp[index]=i; c[i]=1;d[index+i]=1;b[index-i+n]=1; dfs(index+1); c[i]=0;d[index+i]=0;b[index-i+n]=0; } } } int main() { cin>>n; temp.resize(n+1); dfs(1); cout<<cnt; return 0; }
取方陣行列數嘗試(可算得在傾斜方向上,i+j 和 i-j+n 值是固定的)
第二種解法最後一個測試點超時,因為每次都要對前面的和現在的位置進行一次比較,函式內兩個耗時O(N^2);
#include<bits/stdc++.h> using namespace std; int n; int cnt=0; vector<int> temp; void dfs(int index){ if(index==n+1){ cnt++; if(cnt<=3){ for(int i=1;i<=n;i++){ if(i==1) cout<<temp[i]; else cout<<' '<<temp[i]; } cout<<endl; } return; } for(int i=1;i<=n;i++){ int flag=1; temp[index]=i; for(int j=1;j<index;j++){ if(temp[index]==temp[j]||abs(temp[index]-temp[j])==abs(index-j)){ flag=0;break; } } if(flag==1) dfs(index+1); } } int main() { cin>>n; temp.resize(n+1); dfs(1); cout<<cnt; return 0; }