zoukankan      html  css  js  c++  java
  • CCF 模拟E DFS深搜

    http://115.28.138.223:81/view.page?opid=5

    这道题问的很怪. 起点DFS,每一个点还要DFS一次,统计不能到终点的个数

    数据量不大这样做也能AC

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int x,y,ax,ay,bx,by;//'#'0, '+'1, '-'2, '|'3, '.'4, 'S', 'T'
    int x1[]={1,-1,0, 0};
    int y1[]={0, 0,1,-1};
    int d[55][55],lable[55][55],labll[55][55];
    int numb,shit=0;
    void ddfs(int xx,int yy)
    {
        if(shit==1){return;}
        if(xx==by&&yy==bx){shit=1;return;}
        if(labll[xx][yy]==2||d[xx][yy]==0||xx<0||yy<0){return;}
        labll[xx][yy]=2;
        if(d[xx][yy]==1)
        {
            for(int i=0;i<4;i++)
            {
                ddfs(xx+x1[i],yy+y1[i]);
                if(shit==1){return;}
            }
        }
        if(d[xx][yy]==2)
        {
            for(int i=2;i<4;i++)
            {
                ddfs(xx+x1[i],yy+y1[i]);
                if(shit==1){return;}
            }
        }
        if(d[xx][yy]==3)
        {
            for(int i=0;i<2;i++)
            {
                ddfs(xx+x1[i],yy+y1[i]);
                if(shit==1){return;}
            }
        }
        if(d[xx][yy]==4)
        {
            for(int i=0;i<1;i++)
            {
                ddfs(xx+x1[i],yy+y1[i]);
                if(shit==1){return;}
            }
        }
        return;
    }
    void dfs(int xx,int yy)//3 0
    {
        if(lable[xx][yy]==1||d[xx][yy]==0||xx<0||yy<0){return;}
        lable[xx][yy]=1;
        for(int i=0;i<y;i++)
        {
            for(int j=0;j<x;j++)
            {
                labll[i][j]=0;
            }
        }
        shit=0;
        ddfs(xx,yy);
        if(shit==0){numb++;}
        if(d[xx][yy]==1)
        {
            for(int i=0;i<4;i++)
            {
                dfs(xx+x1[i],yy+y1[i]);
            }
        }
        if(d[xx][yy]==2)
        {
            for(int i=2;i<4;i++)
            {
                dfs(xx+x1[i],yy+y1[i]);
            }
        }
        if(d[xx][yy]==3)
        {
            for(int i=0;i<2;i++)
            {
                dfs(xx+x1[i],yy+y1[i]);
            }
        }
        if(d[xx][yy]==4)
        {
            for(int i=0;i<1;i++)
            {
                dfs(xx+x1[i],yy+y1[i]);
            }
        }
        return;
    }
    
    int main()
    {
        while(cin>>y>>x)
        {
            char c;
            numb=0;
            for(int i=0;i<y;i++)
            {
                for(int j=0;j<x;j++)
                {
                    cin>>c;
                    if(c=='S'){d[i][j]=1;ax=j;ay=i;}
                    if(c=='T'){d[i][j]=1;bx=j;by=i;}
                    if(c=='#'){d[i][j]=0;}
                    if(c=='+'){d[i][j]=1;}
                    if(c=='-'){d[i][j]=2;}
                    if(c=='|'){d[i][j]=3;}
                    if(c=='.'){d[i][j]=4;}
                }
            }
            shit=0;
            ddfs(ay,ax);
            if(shit==0){cout<<"I'm stuck!"<<endl;continue;}
            dfs(ay,ax);
            cout<<numb<<endl;
            for(int i=0;i<y;i++)
            {
                for(int j=0;j<x;j++)
                {
                    d[i][j]=lable[i][j]=0;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/dzzy/p/5330919.html
Copyright © 2011-2022 走看看