前排
by sky5168 @ 2019-05-18 10:55:12
@[Bonsoir](/space/show?uid=125352)
1.我不是大佬
2.~~好诡异的码风~~
3.while循环判断条件是不是可以写<=(这句是废话)
4.你可以看一下马有几种移动方式...
5.你判断了a和b是否小于0但是没判断是否超出上界,比如出现(2,2333)这种情况
6.队列处理方面海星,建议闲暇时间学学stl里的queue与priority queue哟!以后可以搭配结构体进行数据处理
7.将s数组初始化时可用memset函数,
文件头:cstring,
用法:可进行对数组的快速统一赋值,但只能赋-1,0,或极大值(图论最短路常用)
非常好用的函数
8.并非棋盘上的每一格棋都要进行搜索,只要根据起始点进行搜索,这是无法到达情况的根本限制
9.注意输出,输出格式已给定,建议用printf,这里printf函数中的格式"%-5d"很有意思,"%md"指输出m位,不足m位补空格右对齐,"%-md"指不足m位补空格左对齐,按题意选择
10.puts函数比其他换行快,并且,printf与scanf也比cout与cin快建议使用格式化输入输出
改了下,望采纳
```cpp
#include<bits/stdc++.h>
using namespace std;
int s[505][505],q[170000][4],x,y,n,m;
int dx[9]= {-2,-1, 1, 2,2,1,-1,-2};
int dy[9]= {-1,-2,-2,-1,1,2, 2, 1};
void ho(int h,int t)
{
int head=1,tail=1;
q[1][1]=h;
q[1][2]=t;
q[1][3]=0;
while(head<=tail)
{
for (int d=0; d<=7; d++)
{
int a=q[head][1]+dx[d];
int b=q[head][2]+dy[d];
if(a<=0||a>n||b<=0||b>m) continue;
if(s[a][b]==-1)
{
tail++;
q[tail][1]=a;
q[tail][2]=b;
q[tail][3]=q[head][3]+1;
s[a][b]=q[head][3]+1;
}
}
head++;
}
}
int main()
{
cin>>n>>m>>x>>y;
memset(s,-1,sizeof(s));
s[x][y]=0;
ho(x,y);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
printf("%-5d",s[i][j]);
puts("");
}
return 0;
}
```
by ガイ @ 2019-06-11 09:21:26
@[ガイ](/space/show?uid=90075)
哇! 真是在谢谢你了orz
by Bonsoir @ 2019-06-13 16:11:32