n皇后问题--DFS输出棋盘
N皇后问题
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出所有的摆放棋盘,并输出所有的合法摆放棋盘个数。
你的任务是,对于给定的N,求出所有的摆放棋盘,并输出所有的合法摆放棋盘个数。
dfs枚举输出
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int pos[10000],vis[1000][1000]; int cnt=0,n; void dfs(int cur) { if(cur==n-1) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(pos[i]==j) cout<<'X'; else cout<<'O'; if(j==n-1) cout<<endl; } } cout<<"................."<<endl; cnt++; } else { for(int i=0;i<n;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])//判断所在位置的列和行、以及对角线上是否有皇后 { pos[cur]=i;//标记皇后的位置(可以认为cur是x坐标,i是y坐标) vis[0][i]=1; vis[1][cur+i]=1; vis[2][cur-i+n]=1; dfs(cur+1); //以下是回溯 vis[0][i]=0; vis[1][cur+1]=0; vis[2][cur-i+n]=0; } } } } int main() { scanf("%d",&n); memset(vis,0,sizeof(vis)); dfs(0); cout<<cnt<<endl; return 0; }
等风起的那一天,我已准备好一切