一开始使用dfs,直接超时。
后来改为bfs,用vis记录每一个点经过的次数,防止多次进入队列导致超时。
(最后和题解一比,感觉自己这种做法好憨)
BFS AC代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<queue>
using namespace std;
const int mod=1e9+7;
#define ll long long
int m,n;
ll ans;
string s[55];
ll vis[55][55];
struct node
{
int i;
int j;
}u,v;
//void dfs(int i,int j)
//{
// if(i==m-1&&j==n-1)
// {
// ans++;
// return ;
// }
// if(s[i][j]=='R'&&j+1<n)
// dfs(i,j+1);
// if(s[i][j]=='D'&&i+1<m)
// dfs(i+1,j);
// if(s[i][j]=='B')
// {
// if(i+1<m)
// dfs(i+1,j);
// if(j+1<n)
// dfs(i,j+1);
// }
//}
void bfs()
{
queue<node> q;
u.i=0;
u.j=0;
q.push(u);
vis[0][0]=1;
while(!q.empty())
{
u=q.front();
q.pop();
if(u.i==m-1&&u.j==n-1)
{
ans+=vis[u.i][u.j]%mod;
break;
}
if(s[u.i][u.j]=='R'&&u.j+1<n)
{
v.i=u.i;
v.j=u.j+1;
if(!vis[u.i][u.j+1])
{
vis[v.i][v.j]+=vis[u.i][u.j];
q.push(v);
}
else
vis[v.i][v.j]+=vis[u.i][u.j];
vis[v.i][v.j]%=mod;
}
if(s[u.i][u.j]=='D'&&u.i+1<m)
{
v.i=u.i+1;
v.j=u.j;
if(!vis[u.i+1][u.j])
{
vis[v.i][v.j]+=vis[u.i][u.j];
q.push(v);
}
else
vis[v.i][v.j]+=vis[u.i][u.j];
vis[v.i][v.j]%=mod;
}
if(s[u.i][u.j]=='B')
{
if(u.i+1<m)
{
v.i=u.i+1;
v.j=u.j;
if(!vis[u.i+1][u.j])
{
vis[v.i][v.j]+=vis[u.i][u.j];
q.push(v);
}
else
vis[v.i][v.j]+=vis[u.i][u.j];
vis[v.i][v.j]%=mod;
}
if(u.j+1<n)
{
v.i=u.i;
v.j=u.j+1;
if(!vis[u.i][u.j+1])
{
vis[v.i][v.j]+=vis[u.i][u.j];
q.push(v);
}
else
vis[v.i][v.j]+=vis[u.i][u.j];
vis[v.i][v.j]%=mod;
}
}
}
}
int main()
{
cin>>m>>n;
for(int i=0;i<m;i++)
cin>>s[i];
bfs();
cout<<ans%mod<<endl;
return 0;
}
下面给题解做法:
利用动态规划:
`
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const long long mod=1e9+7;
long long dp[55][55];
int m,n;
string s[55];
int main()
{
cin>>m>>n;
dp[0][0]=1;
for(int i=0;i<m;i++)
cin>>s[i];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
dp[i][j]%=mod;
if(s[i][j]=='R')
dp[i][j+1]+=dp[i][j];
if(s[i][j]=='D')
dp[i+1][j]+=dp[i][j];
if(s[i][j]=='B')
dp[i+1][j]+=dp[i][j],dp[i][j+1]+=dp[i][j];
}
}
cout<<dp[m-1][n-1]%mod<<endl;
return 0;
}