搜索
一、八皇后 Checker Challenge
一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 5 2 \4\ 6\ 1\ 3\ 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下:
行号 1\ 2\ 3\ 4\ 5\ 6 1 2 3 4 5 6
列号 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5
这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 33 个解。最后一行是解的总个数。
输入格式
输出格式
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
输入输出样例
输入 #1
输出 #1
源代码
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int a[20],b[20],c[20],d[40],n,k=0;
void dfs(int step)
{
int i,j,flag;
if(step==n)
{
if(k<=2)
{
for(i=0;i<n;i++)
cout<<b[i]<<' ';
cout<<endl;
}
k++;
return;
}
for(j=0;j<n;j++)
{
flag=0;
if(a[j]==1)
flag=1;
if(c[step+j]==1)
flag=1;
if(d[j+n-step]==1)
flag=1;
if(flag==0)
{
a[j]=1;
b[step]=j+1;
c[step+j]=1;
d[j+n-step]=1;
dfs(step+1);
a[j]=0;
b[step]=0;
c[step+j]=0;
d[j+n-step]=0;
}
}
return;
}
int main()
{
cin>>n;
dfs(0);
cout<<k;
}
小结
主要是要控制好输出的个数,超过三个的部分不输出,但是输出的总数还是在增加。其次就是控制好行和列的表达,因为要找出横排竖排还有斜向有没有棋子。
马的遍历
有一个 n×m 的棋盘,在某个点 (x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n, m, x, yn,m,x,y。
输出格式
一个 n×m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 5 格,不能到达则输出 -1−1)。
输入输出样例
输入 #1
输出
## FLowchart流程图
我们依旧会支持flowchart的流程图:
```mermaid
flowchat
st=>start: 开始
e=>end: 结束
op=>operation: 我的操作
cond=>condition: 确认?
st->op->cond
cond(yes)->e
cond(no)->op
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct step{
int x;
int y;
}a[160010];
int n,m,sx,sy,xx,yy,tu[401][401],nxt[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
int main()
{
int i,j;
cin>>n>>m>>sx>>sy;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
tu[i][j]=-1;
tu[sx][sy]=0;
int head,tail;
head=0,tail=1;
a[tail].x=sx;
a[tail].y=sy;
int step;
while(head<tail)
{
head++;
step=tu[a[head].x][a[head].y]+1;
for(i=0;i<8;i++)
{
xx=a[head].x+nxt[i][0];
yy=a[head].y+nxt[i][1];
if(tu[xx][yy]==-1&&xx<=n&&yy<=m&&xx>=1&&yy>=1)
{
tail++;
a[tail].x=xx;
a[tail].y=yy;
tu[xx][yy]=step;
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf("%-5d",tu[i][j]);
}
cout<<endl;
}
}
小结
先将整个区域标记为-1,再用BFS去搜索,搜索完之后直接输出整个数组即可