这是个广搜,思路和普通的迷宫题差不多,但我卡了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[401][401],dx[8]={2,2,1,1,-1,-1,-2,-2},dy[8]={1,-1,2,-2,2,-2,1,-1}; bool vis[401][401]; 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 0; if(xx<1||yy<1||xx>n||yy>m)return 0; return 1; } int main() { scanf("%d%d%d%d",&n,&m,&sx,&sy); a[sx][sy]=0; vis[sx][sy]=1; q.push(dl(sx,sy)); while(!q.empty()) {dl ex=q.front(); q.pop(); for(int i=0;i<=7;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]+1; vis[xx][yy]=1; q.push(dl(xx,yy)); } } } for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {if(a[i][j]==0&&(i!=sx||j!=sy)) a[i][j]=-1; printf("%-5d",a[i][j]); } printf("\n"); } }
原文:https://www.cnblogs.com/lcez56jsy/p/10720177.html