洛谷 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);
            }
        }
    } 
}

 

posted @ 2018-01-06 15:16  一蓑烟雨任生平  阅读(288)  评论(0编辑  收藏  举报