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