全RE求调!(不开O2优化全TLE)

P1443 马的遍历

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

一堆bug

首先你的dxdy数组的访问出了问题,所以你全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已过,谢谢


|