Untitled

public
6shootingstar9 May 12, 2025 Never 4
Clone
Markdown paste1.md 239 lines (227 loc) | 4.46 KB

前情提要:题面逆天,笑死我了。。

这道题一眼就是个搜索,然后我就随手写了个 dfs。

//不是哥们这题面笑死我了

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
char mp[N][N];
int vis[N][N];
int sx,sy,tx,ty;
int ans=1000005;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
void dfs(int x,int y,int step)
{
    if(x==tx&&y==ty)
    {
        ans=min(ans,step);
        return;
    }
    for(int i=0;i<4;i++)
    {
        int xx=x;
        int yy=y;
        while((xx!=tx||yy!=ty)&&xx+dx[i]>0&&yy+dy[i]>0&&xx+dx[i]<=n&&yy+dy[i]<=m&&mp[xx+dx[i]][yy+dy[i]]=='0')
        {
            xx+=dx[i];
            yy+=dy[i];
        }
        if(vis[xx][yy]==1)
        {
            continue;
        }
        vis[xx][yy]=1;
        dfs(xx,yy,step+1);
        vis[xx][yy]=0;
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mp[i][j];
        }
    }
    cin>>sx>>sy>>tx>>ty;
//	vis[sx][sy]=1;
    dfs(sx,sy,0);
    cout<<ans;
    return 0;
}

然后……不是怎么又 T 又 WA 的啊!!!(此时只有 50pts)

于是我就经历了一通的头脑风暴……

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
char mp[N][N];
struct node
{
    int x,y,step;
};
queue<node>q;
node s,t;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int vis[N][N];
bool flag=1;
int ans=0;
void bfs()
{
    while(!q.empty())
    {
        node tmp=q.front();
        q.pop();
        cout<<tmp.x<<' '<<tmp.y<<endl;
        if(tmp.x==t.x&&tmp.y==t.y)
        {
            ans=tmp.step;
            flag=0;
            return;
        }
        for(int i=0;i<4;i++)
        {
            node a=tmp;
            while(a.x+dx[i]>0&&a.y+dy[i]>0&&a.x+dx[i]<=n&&a.y+dx[i]<=m&&mp[a.x+dx[i]][a.y+dy[i]]=='0'&&(a.x!=t.x||a.y!=t.y)&&vis[a.x+dx[i]][a.y+dy[i]]==0)
            {
                a.x+=dx[i];
                a.y+=dy[i];
            }
            a.step++;
            if(a.x==tmp.x&&a.y==tmp.y)
            {
                continue;
            }
            if(a.x==t.x&&a.y==t.y)
            {
                ans=a.step;
                flag=0;
                return;
            }
            q.push(a);
            vis[a.x][a.y]=1;
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mp[i][j];
        }
    }
    cin>>s.x>>s.y>>t.x>>t.y;
    s.step=0;
    q.push(s);
    vis[s.x][s.y]=1;
    bfs();
    if(flag)
    {
        cout<<"No!God!Please no!";
    }
    else
    {
        cout<<ans;
    }
    return 0;
}

不是,这下只剩 30pts 就算了,怎么还是 WA+RE 的!!!

下面的调试过程就不贴了。

关于 WA 的问题其实就是一些小细节,原因是我手误把条件里的 a.y+dy[i] 写成了 a.y+dx[i]

还有一部分问题就是我判断条件写得有点儿问题。

下面上正常的代码:

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
char mp[N][N];
struct node
{
    int x,y,step;
};
queue<node>q;
node s,t;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int vis[N][N];
bool flag=1;
int ans=0;
void bfs()
{
    while(!q.empty())
    {
        node tmp=q.front();
        q.pop();
        // cout<<tmp.x<<' '<<tmp.y<<endl;
        if(tmp.x==t.x&&tmp.y==t.y)
        {
            ans=tmp.step;
            flag=0;
            return;
        }
        for(int i=0;i<4;i++)
        {
            node a=tmp;
            while(a.x+dx[i]>0&&a.y+dy[i]>0&&a.x+dx[i]<=n&&a.y+dy[i]<=m&&mp[a.x+dx[i]][a.y+dy[i]]=='0'&&(a.x!=t.x||a.y!=t.y))
            {
                a.x+=dx[i];
                a.y+=dy[i];
            }
            a.step++;
            if(a.x==tmp.x&&a.y==tmp.y)
            {
                continue;
            }
            if(vis[a.x][a.y])
            {
                continue;
            }
            if(a.x==t.x&&a.y==t.y)
            {
                ans=a.step;
                flag=0;
                return;
            }
            q.push(a);
            vis[a.x][a.y]=1;
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mp[i][j];
        }
    }
    cin>>s.x>>s.y>>t.x>>t.y;
    s.step=0;
    q.push(s);
    vis[s.x][s.y]=1;
    bfs();
    if(flag)
    {
        cout<<"No!God!Please no!";
    }
    else
    {
        cout<<ans;
    }
    return 0;
}