首页 > 其他 > 详细

D. Treasure Island

时间:2019-09-04 22:22:47      阅读:250      评论:0      收藏:0      [点我收藏+]

D. Treasure Island

dfs大法好==

写半天bfs疯狂MLE

dfs标记掉路上的一些点

然后再跑一遍dfs

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sc(x) scanf("%I64d",&x);
#define read(A) for(int i=0;i<n;i++)scanf("%I64d",&A[i]);
#define endl ‘\n‘
#define fi first
#define se second
#define si signed
#define P pair<si,si>
#define pb push_back
#define maxn 1000000+100
bool A[maxn];
int n,m;
queue<P>q;
P fa[maxn];
bool vis[maxn];
int cnt=0;
bool bfs()
{
    while(!q.empty())q.pop();
    q.push(P(0,0));
    while(!q.empty())
    {
        P a=q.front();
        q.pop();
        si x=a.fi;
        si y=a.se;
        //B[x*m+y]++;
        if(x==n-1&&y==m-1)
        {
          //  cnt++;
            //f=0;
            return false;
        }
        if(x+1<n)
        {
            if(A[(x+1)*m+y]==0)
            {
                fa[(x+1)*m+y]=P(x,y);
                q.push(P(x+1,y));
            }
        }
        if(y+1<m)
        {
            if(A[x*m+y+1]==0)
            {
                fa[x*m+y+1]=P(x,y);
                q.push(P(x,y+1));

            }
        }
    }

    return true;
    //else return false;
}
bool dfs(int x,int  y)
{
    vis[x*m+y]=1;
    int a=x+1;
    if(x==n-1&&y==m-1)return true;
    if(a<n&&!vis[a*m+y]&&A[a*m+y]==0){
        if(dfs(a,y))return true;
    }
    int b=y+1;
    if(b<m&&!vis[x*m+b]&&A[x*m+b]==0){
        if(dfs(x,b))return true;
    }
    return false;

}
signed main()
{
    sc(n);
    sc(m);
    int t=0;
    for(int i=0; i<n; i++)
    {
        getchar();
        for(int j=0; j<m; j++)
        {
            A[i*m+j]=(getchar()==#?1:0);
            t+=A[i*m+j];
        }
    }
    if(t==0&&(n==1||m==1)){
        cout<<1<<\n;
        return 0;
    }
    if(t==0)
    {
        cout<<2<<\n;
        return 0;
    }
    if(n==1||m==1){
        cout<<0<<\n;
        return 0;
    }
    int ans=2;
    if(!dfs(0,0)){
        cout<<0<<\n;
        return 0;
    }
    vis[0]=vis[(n-1)*m+m-1]=0;
    if(!dfs(0,0)){
        cout<<1<<\n;
        return 0;
    }
    cout<<2<<\n;
   /* if(bfs())
    {
        cout<<0<<‘\n‘;
        return 0;
    }
    //cout<<B[1*m+2]<<endl;
    P x=fa[(n-1)*m+m-1];
    si c,d;
    while(true){
        c=x.fi,d=x.se;
        if(c==0&&d==0)break;
        x=fa[c*m+d];
        A[c*m+d]=1;
    }
    if(bfs()){
        cout<<1<<‘\n‘;
        return 0;
    }
    cout<<ans<<‘\n‘;
*/
}

 

D. Treasure Island

原文:https://www.cnblogs.com/liulex/p/11461685.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!