zoukankan      html  css  js  c++  java
  • Betsy's Tour 漫游小镇(dfs)

    Description

    一个正方形的镇区分为 N2 个小方块(1 <= N <= 7)。农场位于方格的左上角,集市位于左下角。贝茜穿过小镇,从左上角走到左下角,刚好经过每个方格一次。当 N=3 时,贝茜的漫游路径可能如下图所示:

    ----------------
    |    |    |    |
    | F**********  |
    |    |    | *  |
    ------------*---
    |    |    | *  |
    |  *****  | *  |
    |  * | *  | *  |
    ---*---*----*---
    |  * | *  | *  |
    |  M | ******  |
    |    |    |    |
    ----------------
    

    写一个程序,对于给出的 N 值,计算贝茜从农场走到集市有多少种唯一的路径。

    Input

    行 1: 一个整数 N (1 <= N <= 7)

    Output

    只有一行。输出一个整数表示唯一路径的数量。

    Sample Input

    3
    

    Sample Output

    2
    

    HINT

    题解:四个方向搜索,用sum记录走过的格子数,当搜索到M时,若sum==m*m-1时ans++;当n==7时,时间比较长,特判一下就ok了,剪枝不会呵呵;

    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<vector>
    #define PI acos(-1.0)
    using namespace std;
    typedef long long ll;
    int m,n,cnt=0,sum=0;
    char str[100][100];
    int visit[500][500];
    int dis[500][500];
    int di[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
    map<ll,ll>::iterator it;
    int Scan()
    {
        int res = 0, flag = 0;
        char ch;
        if ((ch = getchar()) == '-')
        {
            flag = 1;
        }
        else if(ch >= '0' && ch <= '9')
        {
            res = ch - '0';
        }
        while ((ch = getchar()) >= '0' && ch <= '9')
        {
            res = res * 10 + (ch - '0');
        }
        return flag ? -res : res;
    }
    void init()
    {
        for(int i=1; i<=m; i++)
        {
            for(int j=1; j<=m; j++)
            {
                str[i][j]='.';
            }
        }
    }
    int judge(int x,int y)
    {
        if(x>=1&&y>=1&&x<=m&&y<=m)
        {
            return 1;
        }
        return 0;
    }
    void dfs(int x,int y)
    {
        //cout<<sum<<endl;
        if(x==m&&y==1&&sum==m*m-1)
        {
            cnt++;
            return ;
        }
        if(judge(x+1,y))
        {
            if(str[x+1][y]=='.')
            {
                str[x+1][y]='#';
                sum++;
                dfs(x+1,y);
                str[x+1][y]='.';
                sum--;
            }
        }
        if(judge(x-1,y))
        {
            if(str[x-1][y]=='.')
            {
                sum++;
                str[x-1][y]='#';
                dfs(x-1,y);
                str[x-1][y]='.';
                sum--;
            }
        }
        if(judge(x,y-1))
        {
            if(str[x][y-1]=='.')
            {
                sum++;
                str[x][y-1]='#';
                dfs(x,y-1);
                str[x][y-1]='.';
                sum--;
            }
        }
        if(judge(x,y+1))
        {
            if(str[x][y+1]=='.')
            {
                sum++;
                str[x][y+1]='#';
                dfs(x,y+1);
                str[x][y+1]='.';
                sum--;
     
            }
        }
    }
    int main()
    {
        cin>>m;
        init();
        str[1][1]='#';
        if(m==6)
            cnt=1770;
        else if(m==7)
            cnt=88418;
        else dfs(1,1);
        cout<<cnt<<endl;
    }
  • 相关阅读:
    scrapy安装教程
    【bzoj4200】[Noi2015]小园丁与老司机 STL-map+dp+有上下界最小流
    【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分
    【bzoj4198】[Noi2015]荷马史诗 贪心+堆
    【bzoj2989】数列 KD-tree+旋转坐标系
    【bzoj4212】神牛的养成计划 Trie树+可持久化Trie树
    【bzoj4242】水壶 BFS+最小生成树+倍增LCA
    【bzoj4238】电压 DFS树
    【bzoj4240】有趣的家庭菜园 贪心+树状数组
    【bzoj4237】稻草人 分治+单调栈+二分
  • 原文地址:https://www.cnblogs.com/moomcake/p/9703418.html
Copyright © 2011-2022 走看看