八皇后问题(模拟y总的,写的可能不好见笑)
方法一:
include[HTML_REMOVED]
using namespace std;
bool nuy[20],nun[200],num[200];
//nuy是记录y轴,nun是主轴,num是副轴
char mapp[20][20];
int n;
void dfs(int u)
{
///当满足(u>n)也就是有一种方法时,直接输出
if(u>n)
{
for(int i=1;i<=n;i){
for(int j=1;j<=n;j) cout<<mapp[i][j];
cout<<endl;
}
cout<<endl;
return;
}
///正常的用for循环来遍历每一行的可能性
for(int i=1;i<=n;i++){
if(!nuy[i]&&!nun[i+u]&&!num[n-i+u])
{//// 这三个是来判断
nuy[i]=nun[i+u]=num[n-i+u]=true;
mapp[u][i]= ‘Q’;
dfs(u+1);
nuy[i]=nun[i+u]=num[n-i+u] = false;
mapp[u][i]= ‘.’;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i){
for(int j=1;j<=n;j) {
mapp[i][j]=’.’;
}
}
dfs(1);
return 0;
}
方法二:
说实话我是看了很多遍第一种方法,但我觉得第二种才是最原始的,也是我能想到的;
放与不放
include[HTML_REMOVED]
using namespace std;
bool nux[20],nuy[20],nun[200],num[200];
char mapp[20][20];
int n;
void dfs(int x,int y,int s)
{
if(y==n) x,y=0;//是从一行开始的
if(x==n)
{
if(s==n)
{
for(int i=0;i<n;i) puts(mapp[i]);
cout<<endl;
}
return;
}
///不放皇后
dfs(x,y+1,s);
////放皇后
if(!nux[x]&&!nuy[y]&&!nun[x+y]&&!num[y-x+n])
{
mapp[x][y]=’Q’;
nux[x]=nuy[y]=nun[x+y]=num[y-x+n]=true;
dfs(x,y+1,s+1);
nux[x]=nuy[y]=nun[x+y]=num[y-x+n]=false;
mapp[x][y]=’.’;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i){
for(int j=0;j<n;j) {
mapp[i][j]=’.’;
}
}
dfs(0,0,0);
return 0;
}