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;
    }
  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/moomcake/p/9703418.html
Copyright © 2011-2022 走看看