约翰 T 秒前看到奶牛在 (x1,y1) 处,而现在看到奶牛在 (x2, y2) 处。毫无疑问,奶牛在这 T 秒内发生了量子隧穿效应。已知奶牛每秒可以移动一步到与当前格子四连通的格子处(除非目标格子处有障碍),现在约翰想知道奶牛有几种可能的隧穿路径。
(其实就是求从(x1,y1)走到(x2,y2)恰好过了 T 秒的路径数量)
第一行包含 3个用空格隔开的整数 n,m,T。
接下来 n 行每行一个长度为 m 的字符串。'.' 是空地,'*'是障碍
最后一行 4 个整数 x1, y1, x2, y2。
输出一行一个整数表示答案。
Input 1
4 5 6
...*.
...*.
.....
.....
1 3 1 5
Output 1
1
样例输入中,奶牛从(1,3)到(1,5)需要6秒,只有一种可能的路径。
2≤N,M≤100,0<T≤15。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey,k,dx[4]={1,-1,0,0},dy[4]={0,0,-1,1},ans;
char a[105][105];
void dfs(int x,int y, int t){
if(x==ex&&y==ey&&t==k){
ans++;
return;
}
if(t>k){
return;
}
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[xx][yy]!='*'){
dfs(xx,yy,t+1);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char kkksc03;
cin>>kkksc03;
a[i][j]=kkksc03;
}
}
cin>>sx>>sy>>ex>>ey;
if(abs(ex-sx)+abs(ey-sy)>k){
cout<<0;
return 0;
}
dfs(sx,sy,0);
cout<<ans;
return 0;
}
TLE 90
哪里能再次剪枝(本题为搜索的剪枝)