HDOJ 1242 DFS

来源:互联网 发布:怪物猎人帅哥捏脸数据 编辑:程序博客网 时间:2024/05/17 02:19

DFS 剪枝

#include <iostream>#include"sstream"#include"string"#include"algorithm"#include"cstring"#include"cstdio"using namespace std;int dir[4][2]={1,0,-1,0,0,1,0,-1};char g[300][300];int r,c;int visit[300][300];int minL[300][300];int minn;int pos;const int inf=9999999;void dfs(int si,int sj,int cnd){    if(g[si][sj]=='a')    {        if(cnd<minn) minn=cnd;        return;    }    for(int i=0;i<4;i++)    {        int ki=si+dir[i][0];        int kj=sj+dir[i][1];        if((ki<r&&ki>=0&&kj<c&&kj>=0)&&(g[ki][kj]=='.'||g[ki][kj]=='x'||g[ki][kj]=='a')&&!visit[ki][kj])        {            if(cnd+1>minL[ki][kj])                 continue;            else minL[ki][kj]=cnd+1; //记录到x,y最短距离            if(g[ki][kj]=='.'||g[ki][kj]=='a')            {                visit[ki][kj]=1;                dfs(ki,kj,cnd+1);                visit[ki][kj]=0;            }            else if(g[ki][kj]=='x')            {                visit[ki][kj]=1;                dfs(ki,kj,cnd+2);                visit[ki][kj]=0;            }        }    }}int main(){    //freopen("a.txt","r",stdin);    while(cin>>r>>c)    {        memset(visit,0,sizeof(visit));        int si,sj;        int i,j;        for(i=0;i<r;i++)            for(j=0;j<c;j++)        {            minL[i][j]=inf;            cin>>g[i][j];            if(g[i][j]=='r')            {sj=j;si=i;}        }        minn=inf;        visit[si][sj]=1;        dfs(si,sj,0);        if(minn<inf)        cout<<minn<<endl;        else            cout<<"Poor ANGEL has to stay in the prison all his life." <<endl;    }    return 0;}

TLE

#include <iostream>#include"sstream"#include"string"#include"algorithm"#include"cstring"#include"cstdio"using namespace std;int dir[4][2]={1,0,-1,0,0,1,0,-1};char g[300][300];int r,c;int visit[300][300];int minn;int pos;const int inf=9999999;void dfs(int si,int sj,int cnd){    if(g[si][sj]=='a')    {        if(cnd<minn) minn=cnd;        return;    }    for(int i=0;i<4;i++)    {        int ki=si+dir[i][0];        int kj=sj+dir[i][1];        if((ki<r&&ki>=0&&kj<c&&kj>=0)&&(g[ki][kj]=='.'||g[ki][kj]=='x'||g[ki][kj]=='a')&&!visit[ki][kj])        {            if(cnd+1>inf) continue;            if(g[ki][kj]=='.'||g[ki][kj]=='a')            {                visit[ki][kj]=1;                dfs(ki,kj,cnd+1);                visit[ki][kj]=0;            }            else if(g[ki][kj]=='x')            {                visit[ki][kj]=1;                dfs(ki,kj,cnd+2);                visit[ki][kj]=0;            }        }    }}int main(){    //freopen("a.txt","r",stdin);    while(cin>>r>>c)    {        memset(visit,0,sizeof(visit));        int si,sj;        int i,j;        for(i=0;i<r;i++)            for(j=0;j<c;j++)        {            cin>>g[i][j];            if(g[i][j]=='r')            {sj=j;si=i;}        }        minn=inf;        visit[si][sj]=1;        dfs(si,sj,0);        if(minn<inf)        cout<<minn<<endl;        else            cout<<"Poor ANGEL has to stay in the prison all his life." <<endl;    }    return 0;}


0 0
原创粉丝点击