照着1本通的思路打的,样例都过不去呜呜呜
查看原帖
照着1本通的思路打的,样例都过不去呜呜呜
89644
Harry_hcx楼主2021/4/14 20:25
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;
int n,k,a,b,c,m[102][102],ans=INT_MAX;
const int dx[5]={0,0,1,0,-1},dy[5]={0,1,0,-1,0};
struct Node{
	int i,j,k,d;
	bool operator <(const Node b)const{return d<b.d;}
};
priority_queue<Node>q;
int dis[102][102][11];
bool vis[102][102][11];
int main(){
	memset(dis,0x3f3f3f3f,sizeof(dis));
	cin>>n>>k>>a>>b>>c;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			cin>>m[i][j];
	q.push((Node){1,1,k,0});
	dis[1][1][k]=0;
	while(!q.empty()){
		int x=q.top().i,y=q.top().j,fuel=q.top().k;
		q.pop();
		if (vis[x][y][fuel]) continue;
		vis[x][y][fuel]=true;
		if (m[x][y]&&fuel!=k){
			if (dis[x][y][k]>dis[x][y][fuel]+a)
				q.push((Node){x,y,k,dis[x][y][k]=dis[x][y][fuel]+a});
			continue;
		}
		else
			if (dis[x][y][k]>dis[x][y][fuel]+a+c)
				q.push((Node){x,y,k,dis[x][y][k]=dis[x][y][fuel]+a+c});
		if (fuel<=0) continue;
		for (int i=1;i<=4;i++){
			int fx=x+dx[i],fy=y+dy[i];
			if (fx<1||fx>n||fy<1||fy>n) continue;
			int addition=(fx<x||fy<y)?b:0;
			if (dis[fx][fy][fuel-1]>dis[x][y][fuel]+addition)
				q.push((Node){fx,fy,fuel-1,dis[fx][fy][fuel-1]=dis[x][y][fuel]+addition});
		}
	}
	for (int i=0;i<=k;i++){
		ans=min(dis[n][n][i],ans);
		//cout<<dis[n][n][i]<<' ';
	}
	cout<<ans;
	return 0;
}

如题,调了好久还是过不去

2021/4/14 20:25
加载中...