40分求助

B3625 迷宫寻路

fupincheng @ 2023-08-27 16:29:49

为什么会TLE?

#include<bits/stdc++.h>
using namespace std;
int n,m,b,h[5][3]={{1,0},{0,1},{-1,0},{0,-1}},v[105][105];
string s[105];
void dfs(int x,int y){
    if(b)return;
    if(y==n&&x==m){
        cout<<"Yes";
        b=1;
        exit(0);
    }
    for(int i=0;i<4;i++){
        int xx=x+h[i][0];
        int yy=y+h[i][1];
        if(v[yy][xx]==0&&xx>=0&&xx<=m&&yy>=0&&yy<=n&&s[yy][xx]=='.'){
            v[yy][xx]=1;
            dfs(xx,yy);
            v[yy][xx]=0;
        }
    }
}
int main(void){
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        cin>>s[i];
    }
    n--,m--;
    dfs(0,0);
    cout<<"No";
    return 0;
}

by wdd2929 @ 2023-08-27 16:35:41

dfs中的

if(y==n&&x==m){

反了……

if(x==n&&y==m){

by AlexSong @ 2023-08-27 16:36:13


#include<bits/stdc++.h>
using namespace std;
long long n,m,f,flag[1001][1001],vis[4][2]={-1,0,1,0,0,-1,0,1};
char arr[1001][1001];
struct node{
    int x,y;
};
queue<node> q;
void bfs(){
    q.push({1,1});
    flag[1][1]=1;
    while(!q.empty()){
        for(int i=0;i<4;i++){
            int xx=q.front().x+vis[i][0];
            int yy=q.front().y+vis[i][1];
            if(arr[xx][yy]=='.' && flag[xx][yy]==0 && xx>=1 && xx<=n && yy>=1 && yy<=m){
                flag[xx][yy]=1;
                if(xx==n && yy==m){
                    cout<<"Yes";
                    f=0;
                    return;
                }
                q.push({xx,yy});
            }
        }
        q.pop();
    }
}
int main(){
    f=1;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>arr[i][j];
        }
    }
    bfs();
    if(f) cout<<"No";
    return 0;
}

by wdd2929 @ 2023-08-27 16:37:03

我是这么写的,你可以参考一下

#include<iostream>
using namespace std;
int dxdy[]={0,1,0,-1,1,0,-1,0};
char map[102][102];
bool f[102][102];
int n,m;
bool flag=0;
void dfs(int x,int y){
    if(x==n&&y==m){
        flag=1;
        return;
    }
    //if(flag)return;
    for(int i=0;i<8;i+=2){
        int x1=x+dxdy[i];
        int y1=y+dxdy[i+1];
        if(!f[x1][y1]&&map[x1][y1]=='.'){
            f[x1][y1]=1;
            dfs(x1,y1);
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>map[i][j];
    dfs(1,1);
    if(flag)cout<<"Yes";
    else cout<<"No";
    return 0;
}

by liu_le_chen @ 2023-08-27 16:46:24

#include<bits/stdc++.h>
using namespace std;
long long n,m,f,flag[1001][1001],vis[4][2]={-1,0,1,0,0,-1,0,1};
char arr[1001][1001];
struct node{
    int x,y;
};
queue<node> q;
void bfs(){
    q.push({1,1});
    flag[1][1]=1;
    while(!q.empty()){
        for(int i=0;i<4;i++){
            int xx=q.front().x+vis[i][0];
            int yy=q.front().y+vis[i][1];
            if(arr[xx][yy]=='.' && flag[xx][yy]==0 && xx>=1 && xx<=n && yy>=1 && yy<=m){
                flag[xx][yy]=1;
                if(xx==n && yy==m){
                    cout<<"Yes";
                    f=0;
                    return;
                }
                q.push({xx,yy});
            }
        }
        q.pop();
    }
}
int main(){
    f=1;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>arr[i][j];
        }
    }
    bfs();
    if(f) cout<<"No";
    return 0;
}

我是这么写的,可以参考一下@fupincheng


by hehedago_QAQ_ @ 2023-08-27 16:50:40

#include<bits/stdc++.h>
using namespace std;
int n,m,h[5][3]={{1,0},{0,1},{-1,0},{0,-1}},ans[101][101];
string s[105];
void dfs(int x,int y){
    if(ans[x][y]==1)return;
    if(y==n&&x==m){
        cout<<"Yes";
        exit(0);
    }
    int a=0;
    for(int i=0;i<4;i++){
        int xx=x+h[i][0];
        int yy=y+h[i][1];
        if(xx>=0&&xx<=m&&yy>=0&&yy<=n&&s[yy][xx]=='.'){
            s[yy][xx]='#';
            dfs(xx,yy);
            s[yy][xx]='.';
        }
    }
    if(a==0)ans[x][y]=1;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        cin>>s[i];
    }
    n--,m--;
    s[0][0]='#';
    dfs(0,0);
    cout<<"No";
    return 0;
}

加入记忆化即可


by hehedago_QAQ_ @ 2023-08-27 16:59:52

你的b数组没有用,

exit(0);就直接退出了

v也可以省略

但还是会超时,所以我加了记忆化

还有你没有初始化起点

代码刚刚发了

给个关注吧


|