传统弱校HFUT的蒟蒻,真相只有一个

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;
}

 

posted @ 2016-03-28 22:15  未名亚柳  阅读(167)  评论(0编辑  收藏  举报