0
点赞
收藏
分享

微信扫一扫

搜索练习题

夹胡碰 2022-01-11 阅读 33

搜索

一、八皇后 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去搜索,搜索完之后直接输出整个数组即可

举报

相关推荐

0 条评论