• 洛谷 P1746 离开中山路


    题目背景

    《爱与愁的故事第三弹·shopping》最终章。

    题目描述

    爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在x1,y1处,车站在x2,y2处。现在给出一个n×n(n<=1000)的地图,0表示马路,1表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(a[i][j]距离为1)。你能帮他解决吗?

    输入输出格式

    输入格式:

     

    第1行:一个数 n

    第2行~第n+1行:整个地图描述(0表示马路,1表示店铺,注意两个数之间没有空格)

    第n+2行:四个数 x1,y1,x2,y2

     

    输出格式:

     

    只有1行:最短到达目的地距离

     

    输入输出样例

    输入样例#1: 复制
    3
    001
    101
    100
    1 1 3 3
    输出样例#1: 复制
    4

    说明

    20%数据:n<=100

    100%数据:n<=1000

    思路:bfs。dfs和spfa等图论算法都会gg。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,ans=0x7f7f7f7f;
    int sx,sy,tx,ty;
    int map[1001][1001];
    int dx[4]={0,0,1,-1};
    int dy[4]={-1,1,0,0};
    void dfs(int x,int y,int tot){
        if(tot>=ans)    return ;
        if(x==tx&&y==ty){
            ans=min(ans,tot);
            return ;
        }
        for(int i=0;i<4;i++){
            int cx=x+dx[i];
            int cy=y+dy[i];
            if(!map[cx][cy]&&cx>=1&&cx<=n&&cy>=1&&cy<=n){
                map[cx][cy]=1;
                dfs(cx,cy,tot+1);
                map[cx][cy]=0;
            }
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                char x;cin>>x;
                map[i][j]=x-'0';
            }
        scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
        dfs(sx,sy,0);
        cout<<ans;
    }
    TLE的dfs
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,ans=0x7f7f7f7f;
    int sx,sy,tx,ty;
    int map[1001][1001];
    int dx[4]={0,0,1,-1};
    int dy[4]={-1,1,0,0};
    struct nond{
        int x,y,step;
    };
    queue<nond>que;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                char x;cin>>x;
                map[i][j]=x-'0';
            }
        scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
        nond tmp;tmp.x=sx;tmp.y=sy;tmp.step=0;
        que.push(tmp);map[sx][sy]=1;
        while(!que.empty()){
            nond now=que.front();
            que.pop();
            for(int i=0;i<4;i++){
                nond c;c.x=now.x+dx[i];
                c.y=now.y+dy[i];
                c.step=now.step+1;
                if(c.x==tx&&c.y==ty){ cout<<c.step;return 0; }
                if(c.x>=1&&c.x<=n&&c.y>=1&&c.y<=n&&!map[c.x][c.y]){
                    map[c.x][c.y]=1;
                    que.push(c);
                }
            }
        } 
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    005本周总结报告
    《大道至简》读后感
    004本周总结报告
    003本周总结报告
    002本周总结报告
    001本周总结报告
    【财经】股市是不是零和博弈?
    【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换
    【Java每日一题】20170217
    【Java每日一题】20170216
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8214322.html
Copyright © 2020-2023  润新知