求助,A*+记忆化居然过不400点搜索
  • 板块灌水区
  • 楼主fangzichang
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/7/10 18:18
  • 上次更新2023/10/27 21:12:22
查看原帖
求助,A*+记忆化居然过不400点搜索
678087
fangzichang楼主2022/7/10 18:18

题目大意:从(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

2022/7/10 18:18
加载中...