洛谷P1443马的遍历

时间:2021-03-03 11:17:04

传送

这是个广搜,思路和普通的迷宫题差不多,但我卡了3遍,为什么呢?

因为输出格式

题目要求左对齐,宽度为5输出,在此说一下如何控制宽度。

下面的m都为要求的宽度

int 类型:

printf: %md(现在是右对齐)

左对齐:%-md

cout:cout<<left<<setw(m)<<"你要输出的东西balabala"<<endl;(左对齐)

cout<<right<<setw(m)<<"你要输出的东西balabala"<<endl;(右对齐)

显然这里我们要写printf("%-5d",a[i][j]);

解决输出,剩下就是广搜模板的问题了。

首先先让马的起点坐标入队,然后在8个方向上扩展。

那到达每个点需要的步数就是到达这个点之前一个点的步数+1(类似递推吧),用a[i][j]记录到达点(i,j)的步数。

广搜到最后,如果有a[i][j]为0且(i,j)不是起点,就把它变为-1,然后输出。

代码如下:

#include<iostream>
#include<cstdio>
#include<queue>
#include<iomanip>
using namespace std;
int n,m,sx,sy,a[][],dx[]={,,,,-,-,-,-},dy[]={,-,,-,,-,,-};
bool vis[][];
struct dl{
int x,y;
dl(int xx,int yy):x(xx),y(yy){}//构造函数,入队用的
//意思就是把x赋值为xx,把y赋值为yy
};
queue<dl>q;
bool hf(int xx,int yy)
{if(vis[xx][yy])return ;
if(xx<||yy<||xx>n||yy>m)return ;
return ;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&sx,&sy);
a[sx][sy]=;
vis[sx][sy]=;
q.push(dl(sx,sy));
while(!q.empty())
{dl ex=q.front();
q.pop();
for(int i=;i<=;i++)
{int xx=ex.x,yy=ex.y;
xx+=dx[i];yy+=dy[i];
if(hf(xx,yy))
{//printf("xx=%d,yy=%d\n",xx,yy);
//getchar(); 分享一下个人广搜的测试方法qwq
a[xx][yy]=a[ex.x][ex.y]+;
vis[xx][yy]=;
q.push(dl(xx,yy));
}
}
}
for(int i=;i<=n;i++)
{for(int j=;j<=m;j++)
{if(a[i][j]==&&(i!=sx||j!=sy))
a[i][j]=-;
printf("%-5d",a[i][j]);
}
printf("\n");
}
}