洛谷P1443 马的遍历
https://www.luogu.org/problemnew/show/P1443
很经典的搜索题了,蒟蒻用广搜打的
不说了,上代码!
#include<bits/stdc++.h> using namespace std; struct xy {//定义结构体 int x,y;//x,y两个方向 } node,Top; int dx[8]={2,-2,2,-2,-1,1,-1,1}; int dy[8]={1,1,-1,-1,2,2,-2,-2};//马走的八个方向 int a[401][401]; bool b[401][401]; int n,m; void bfs(int x,int y,int step) {//广搜函数 a[x][y]=step; b[x][y]=false; queue<xy>q;//建立一个队列 node.x=x; node.y=y; q.push(node);//入队 while (!q.empty()){//如果队列不为空就循环 Top=q.front();//取队首元素 q.pop();//出队 for (int i=0;i<8;i++){ int newx=Top.x+dx[i]; int newy=Top.y+dy[i];//往八个方向遍历 if (newx<1||newx>n||newy<1||newy>m) continue;//判断是否越界 if (b[newx][newy]){//如果该点没有标记过 node.x=newx; node.y=newy;//更新 q.push(node);//入队 b[newx][newy]=false;//标记 a[newx][newy]=a[Top.x][Top.y]+1;//步数+1 } } } } int main() { memset(b,true,sizeof(b)); memset(a,-1,sizeof(a));//数组初始化 int x,y; cin>>n>>m>>x>>y;//输入 bfs(x,y,0);//广搜 for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) printf("%-5d", a[i][j]);//输出五位常宽 cout<<endl;//换行 } return 0; }