题目大意:从(1,1)到(n,m),移动时只要曼哈顿距离小于给定值p就可以瞬移,一些点是障碍,不能站在上面,求最短距离和最短路径数量,0<n,m<=20
本人代码
#include<bits/stdc++.h>
#define LL long long
//英特纳雄耐尔一定要实现
using namespace std;
const int N=100;
int n,m,p,f[N][N],ans;
bool b[N][N];
int h(int x,int y){
return (n-x+m-y)/p+bool((n-x+m-y)%p);
}//估价
void dfs(int nowx,int nowy,int len){
if(len+h(nowx,nowy)>f[n][m]) return;//剪枝
if(nowx==n&&nowy==m){
if(len>f[nowx][nowy]) return;//到达,非最优
else if(len==f[nowx][nowy]){
ans++;//到达,一样优
return;
}
else{
ans=1;
f[n][m]=len;//到达,比原先更优
return;
}
}
if(f[nowx][nowy]>=len) f[nowx][nowy]=len;//记忆化
else return;//剪枝
for(int i=nowx-p;i<=nowx+p;i++){
for(int j=nowy-p;j<=nowy+p;j++){
if(i<1||j<1||i>n||j>m) continue;
if(abs(nowx-i)+abs(nowy-j)<=p&&b[i][j]==0){
dfs(i,j,len+1);
}
// else break;
}
}
}
int main(){
// freopen("blessing.in","r",stdin);
// freopen("blessing.out","w",stdout);
cin>>n>>m>>p;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>b[i][j];
}
}
memset(f,0x3f3f3f,sizeof(f));
f[1][1]=0;
dfs(1,1,0);
cout<<f[n][m]<<" "<<ans<<endl;
return 0;
}
rt,结果是60分其余TLE,同学写的和我差不多的都A了,求看看哪里细节出问题了orz