不会判断无法到达的情况 求大佬指点

P1443 马的遍历

前排
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


|