Charlie509 @ 2024-11-17 20:52:09
贴上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=405;
queue<int>qx,qy,qstep;
int n,m,x,y,f[maxn][maxn],ans[maxn][maxn],vis[maxn][maxn],dx[]={-1,-2,-2,-1,1,2,2,1},dy[]={2,1,-1,-2,2,1,-1,-2};
void bfs(){
while(!qx.empty()){
int xf=qx.front(),yf=qy.front(),stepf=qstep.front();
ans[xf][yf]=stepf;
qx.pop();qy.pop();qstep.pop();
for(int i=1;i<=8;i++){
if(xf+dx[i]>=1&&xf+dx[i]<=n&&yf+dy[i]>=1&&yf+dy[i]<=m&&vis[xf+dx[i]][yf+dy[i]]==0){
vis[xf+dx[i]][yf+dy[i]]=1;
qx.push(xf+dx[i]);
qy.push(yf+dy[i]);
qstep.push(stepf+1);
}
}
}
}
int spaceNum(int ansIJ){
int a;
if(ansIJ==0)return 4;
while(ansIJ>0){
a++;
a/=10;
}
return a;
}
int main()
{
cin>>n>>m>>x>>y;
qx.push(x);
qy.push(y);
qstep.push(0);
vis[x][y]=1;
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
if(!vis[i][j])printf("-1 ");
else{
cout<<ans[i][j];
for(int num=1;num<=spaceNum(ans[i][j]);num++)cout<<" ";
}
cout<<"\n";
}
return 0;
}
整个程序在本地运行的时候刚输出玩第二个就卡住了!
大佬求调!
by pengchengen @ 2024-11-28 19:50:10
首先你的dx和dy数组的访问出了问题,所以你全RE了
这个for应该改为
for(int i=0;i<8;i++)
然后你对-1的情况的判断不正确, 你可以先将ans数组初始化一个极大数,然后最后判断
int main()
{
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans[i][j]=INT_MAX;
}
}
qx.push(x);
qy.push(y);
qstep.push(0);
vis[x][y]=1;
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ans[i][j]==INT_MAX) ans[i][j]=-1;
cout<<ans[i][j];
for(int num=1;num<=5-spaceNum(ans[i][j]);num++) cout<<" ";
}
cout<<'\n';
}
return 0;
}
然后就是输出空格的for和函数出现了问题,循环次数应是 场宽 - 位数,spacenum这个函数应该是ansIJ/=10,这两个改为
int spaceNum(int ansIJ){
int a=0;
if(ansIJ==0) return 1;
if(ansIJ==-1) return 2;
while(ansIJ){
a++;
ansIJ/=10;
}
return a;
}
for(int num=1;num<=5-spaceNum(ans[i][j]);num++) cout<<" ";
最后贴上AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=405;
queue<int> qx,qy,qstep;
int n,m,x,y;
int ans[maxn][maxn],vis[maxn][maxn];
int dx[]={-1,-2,-2,-1,1,2,2,1};
int dy[]={2,1,-1,-2,2,1,-1,-2};
void bfs(){
while(!qx.empty()){
int xf=qx.front(),yf=qy.front(),stepf=qstep.front();
ans[xf][yf]=stepf;
qx.pop();qy.pop();qstep.pop();
for(int i=0;i<8;i++){
if(xf+dx[i]>=1&&xf+dx[i]<=n&&yf+dy[i]>=1&&yf+dy[i]<=m&&vis[xf+dx[i]][yf+dy[i]]==0){
vis[xf+dx[i]][yf+dy[i]]=1;
qx.push(xf+dx[i]);
qy.push(yf+dy[i]);
qstep.push(stepf+1);
}
}
}
}
int spaceNum(int ansIJ){
int a=0;
if(ansIJ==0) return 1;
if(ansIJ==-1) return 2;
while(ansIJ){
a++;
ansIJ/=10;
}
return a;
}
int main()
{
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans[i][j]=INT_MAX;
}
}
qx.push(x);
qy.push(y);
qstep.push(0);
vis[x][y]=1;
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ans[i][j]==INT_MAX) ans[i][j]=-1;
cout<<ans[i][j];
for(int num=1;num<=5-spaceNum(ans[i][j]);num++) cout<<" ";
}
cout<<'\n';
}
return 0;
}
by GX0303 @ 2024-11-30 11:47:32
谢谢,大佬,我看您的讲解bug,我都会了,已关注
by Charlie509 @ 2024-11-30 14:21:04
@pengchengen已过,谢谢