USACO Section 5.4 Betsy's Tour

来源:互联网 发布:js 订阅发布模式代码 编辑:程序博客网 时间:2024/06/06 13:14

题意:

n*n的迷宫  从左上角走到左下角  路过的房间不重复  问  一共几种走法


思路:

DFS+2个剪枝

1、通过度来剪枝  如果现在相邻的点度为1(与现在的点相连的边已经剪掉)那么一定要走它  如果有多个这种点  走遍屋子是不可能的

2、如果撞墙了  判断是否将屋子隔成了两半


代码:

/*ID: housera1PROG: betsyLANG: C++*/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 10int vis[N][N],d[N][N],dir[4][2]={ {0,1},{1,0},{0,-1},{-1,0} };int n,ans;void dfs(int x,int y,int s){    int i,fx,fy,m,f;    vis[x][y]=1;    for(i=0,m=0;i<4;i++)    {        fx=x+dir[i][0]; fy=y+dir[i][1];        if(fx>=1&&fx<=n&&fy>=1&&fy<=n&&!vis[fx][fy])        {            d[fx][fy]--;            if(d[fx][fy]==1&&(fx!=n||fy!=1))            {                m++;                f=i;            }        }    }    if(m==1)    {        fx=x+dir[f][0]; fy=y+dir[f][1];        dfs(fx,fy,s-1);    }    else if(m==0)    {        for(i=0;i<4;i++)        {            fx=x+dir[i][0]; fy=y+dir[i][1];            if(fx>=1&&fx<=n&&fy>=1&&fy<=n)            {                if(fx==n&&fy==1)                {                    if(!vis[fx][fy]&&s==1) ans++;                }                else if(!vis[fx][fy])                {                    if((fx==1||fx==n)&&fy!=1&&fy!=n&&!vis[fx][fy-1]&&!vis[fx][fy+1]);                    else if((fy==1||fy==n)&&fx!=1&&fx!=n&&!vis[fx-1][fy]&&!vis[fx+1][fy]);                    else dfs(fx,fy,s-1);                }            }        }    }    for(i=0;i<4;i++)    {        fx=x+dir[i][0]; fy=y+dir[i][1];        if(fx>=1&&fx<=n&&fy>=1&&fy<=n&&!vis[fx][fy]) d[fx][fy]++;    }    vis[x][y]=0;}int main(){    int Debug=0;    if(!Debug)    {        freopen("betsy.in","r",stdin);        freopen("betsy.out","w",stdout);    }    scanf("%d",&n);    if(n==1)    {        printf("1\n");        return 0;    }    ans=0;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            if(i==1&&j==1||i==n&&j==n||i==1&&j==n||i==n&&j==1) d[i][j]=2;            else if(i==1||j==1||i==n||j==n) d[i][j]=3;            else d[i][j]=4;        }    }    dfs(1,1,n*n-1);    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击