1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: —— 通过数: ——
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
...以下省略
【代码】
#include <bits/stdc++.h>
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <stdio.h>
#include <iomanip>
#include <math.h>
#include <cmath>
using namespace std;
const int dx[9]={-1,-1,-1,0,0,1,1,1},dy[9]={-1,0,1,-1,1,-1,0,1};
int vis[9][9],ans[9],tot;
bool check(int x, int y)
{
return (x>=1&&x<=8&&y>=1&&y<=8);
}
void se(int x, int y)
{
++vis[x][y];
for (int o=0;o<8;o++)
{
int i=x,j=y;
while (check(i+dx[o],j+dy[o]))
{
i=i+dx[o],j=j+dy[o];
++vis[i][j];
}
}
}
void er(int x, int y)
{
--vis[x][y];
for (int o=0;o<8;o++)
{
int i=x,j=y;
while(check(i+dx[o],j+dy[o]))
{
i=i+dx[o],j=j+dy[o];
--vis[i][j];
}
}
}
void write()
{
++tot;
cout<<"No. "<<tot<<endl;
for (int i=1;i<=8;i++)
{
for (int j=1;j<=8;j++)
cout<<((j!=ans[i])?0:1)<<" ";
cout<<endl;
}
}
void dfs(int dep)
{
if (dep==9)
{
write();
return;
}
for (int i=1;i<=8;i++)
if (!vis[i][dep])
{
ans[i]=dep;
se(i,dep);
dfs(dep+1);
er(i,dep);
ans[i]=0;
}
}
int main()
{
dfs(1);
}
点个赞吧QAq
O_–|_