洛谷 P1443 【马的遍历】

自从学了宽搜到现在,从未用过STL写要带有多个参数的题
(有次跟同学说,结果他回我不还是你不会嘛。。。)

说实话用STL写还真是挺麻烦的

队列的类型是结构体(push的时候也要push结构体)
记录横纵坐标和步数

然后最好用增量数组免得一大堆if

#include
#include
#include
#include
using namespace std;
int m,n;
int a[407][407];
bool vis[407][407];
int dx[8]={-2,-1,1,2,2,1,-1,-2};//记得是马,一开始写成普通的了
int dy[8]={1,2,2,1,-1,-2,-2,-1};
struct node{
	int x;
	int y;
	int s;
};
queue<node> q;
node ma;
void bfs()
{
	q.push(ma);//初始入队
	while(!q.empty())//队不空
	{
		node nm=q.front();//取出队首
		for(int i=0;i<8;i++)
		{	//增量数组枚举每个可能的点
			int nx=nm.x+dx[i];
			int ny=nm.y+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny])//判断在棋盘内以及没有走过
			{
				vis[nx][ny]=true;//标记为走过
				a[nx][ny]=nm.s+1;//步数是上一步的步数加一
				node qm;
				qm.x=nx;
				qm.y=ny;
				qm.s=nm.s+1;
				q.push(qm);//把当前点入队
			}
		}
		q.pop();
	}
}
int main()
{
	cin>>n>>m;//读入别读反了
	cin>>ma.x>>ma.y;//一开始马的坐标
	ma.s=0;//步数此时为0
	memset(a,-1,sizeof(a));//假设全部无法到达
	a[ma.x][ma.y]=ma.s;//起始点
	vis[ma.x][ma.y]=true;//标记走过了
	bfs();//宽搜
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		cout<<left<<setw(5)<<a[i][j];
		cout<<endl;//记得前面有left(我也不知道为什么必须要有)
	}
	return 0;
}

我找了半小时的错,看了五六份题解,没想到是场宽控制有问题!!!

你可能感兴趣的:(宽搜)