bnu1055 走迷宫2

来源:互联网 发布:网络歌曲八万 编辑:程序博客网 时间:2024/05/22 06:42

走迷宫是很有趣的一种游戏,能够锻炼人的记忆力和思维.现在,HK被困在一个迷宫里面了,请你帮助他计算一下有多少种不同的走法,能够让他走出迷宫.这个迷宫很奇怪,HK只能够沿着向上或者向右的方向走,不能回头.

迷宫使用一个N*M的矩阵来描述,矩阵中用’.’代表空格可以通行,用’*’代表障碍物,用’S’代表出发点,用’T’代表出口.例如下面的一个矩阵就描述了一个8*8的迷宫

…..T..
..*.
……*.
.**.*.
……*.
.**.*.
S..*….
……..
Input
每个输入文件只包含一组输入数据.
每组数据第一行是两个正整数N和M(N,M<=100).
接着是一个N*M的矩阵.
Output
输出HK能够选用的不同方法数(由于结果可能很大,输出模1908的余数即可).




这道题直接搜一下就行了,反正只有两个方向,不过需要记忆化一下,不然T了。

#include<iostream>using namespace std;#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<stdlib.h>#include<vector>#include<queue>#include<deque>#include<map>#include<set>#include<time.h>#define pi(x,y) printf("%d%c",(x),(y));#define pin(x) printf("%d\n",(x));#define si(x) scanf("%d",&(x))#define sii(x,y) scanf("%d%d",&(x),&(y))#define s3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))#define rep(x,y,z) for(int (x)=(y);(x)<(z);++(x))#define dep(x,y,z) for(int (x)=(y)-1;(x)>=(z);--(x))#define read int TcaseN;scanf("%d",&TcaseN);for(int Tcase=1;Tcase<=TcaseN;++Tcase)#define cls(x,y) memset((x),(y),sizeof((x)));#define pb(x) push_back(x)#define mp(x,y) make_pair((x),(y))#define max3(value_a,value_b,value_c) max(max(value_a,value_b),value_c)#define min3(value_a,value_b,value_c) min(min(value_a,value_b),value_c)#define GT(x) (x)=clock();#define fin(x) freopen(x,"r",stdin);#define fout(x) freopen(x,"w",stdout);///In This You Can Define Long Integer Type#define LONGTYPE long longtypedef LONGTYPE LL;typedef unsigned LONGTYPE ULL;const int maxint=((~((unsigned)(0)))>>1);const LL maxll=((~((unsigned LONGTYPE)(0)))>>1);const int inf=0x3f3f3f3f;const double PI=acos(-1.0);const int N=105;const int MOD=1908;char a[N][N];int n,m;int dp[N][N];pair<int,int> s,t;int d[2][2]={{0,1},{-1,0}};/**4 4...T........S...*/int dfs(int x,int y){    if(a[x][y]=='T')return 1;    if((x<t.first)||(y>t.second))return 0;    if(~dp[x][y])return dp[x][y];    int ans=0;    for(int i=0;i<2;++i){        int tx=x+d[i][0],ty=y+d[i][1];        if(tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]!='*'){            ans+=dfs(tx,ty);        }    }    return dp[x][y]=(ans%MOD);}int main() {#ifdef tangge    clock_t tSTART,tEND,t3;    GT(tSTART);#endif // tangge    /*Input:*///    freopen("1055.in","r",stdin);    while(scanf("%d%d",&n,&m)==2){        for(int i=0;i<n;++i){            scanf("%s",a[i]);            for(int j=0;j<m;++j){                if(a[i][j]=='S')s.first=i,s.second=j;                else if(a[i][j]=='T')t.first=i,t.second=j;            }        }        memset(dp,-1,sizeof(dp));        printf("%d\n",dfs(s.first,s.second));    }#ifdef tangge    GT(tEND);    printf("%.8lf\n",(tEND-tSTART)/1000.0);#endif // tangge    return 0;}
原创粉丝点击