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

 

posted @ 2018-09-25 20:48  左手边五十米  阅读(633)  评论(0编辑  收藏  举报