P2644 57分求调求求求求求你了
  • 板块题目总版
  • 楼主YourReality
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/25 18:59
  • 上次更新2023/11/2 18:08:31
查看原帖
P2644 57分求调求求求求求你了
557044
YourReality楼主2023/9/25 18:59
#include<bits/stdc++.h>
using namespace std;
long long int p,m,n,A[50][50],B[50][50],vis[50][50],js,jg,s=1e9,sw=0,g,wg,a,b,c,d,stp,pd;
struct u{
	int h,z;
};
u D[10];
map<long long int,long long int> mp;
void dfs(int x,int y){
	if(vis[x][y]==1 || A[x][y]==5 || js>s || js>p || x<1 || x>n || y<1 || y>m || js>B[x][y] || stp>15) return;
	B[x][y]=js;//1为水,0为莲花,5 为岩石,3 为贝西所在的起点,4 为贝西想去的终点,2 为铂金的埋藏地。
	if(A[x][y]==4){
		//cout<<js<<endl;第一行:用空格分隔开 S 和 WS两个整数,需要最少消耗的体力及方案数;如果无法帮助,输出 -1。)
		//第二行:用空格分隔开 G 和 W G(两个整数,在消耗最少的前提下开采最多的铂金数及方案数,若在 S 点体力内无法开采铂金,第二行输出 -1。)
		if(js==s){
			if(!mp[pd]) sw++;
			if(jg==g){
				if(!mp[pd]) wg++;
			}
			if(jg>g){
				g=jg,wg=stp;
			}
		}
		else{
			s=js,sw=1,g=jg,wg=1;
		}
		mp[pd]=1;
		return;
	}
	vis[x][y]=1;
	stp++;
	if(A[x][y]==2 || A[x][y]==1){
		js+=A[x][y];
		jg+=A[x][y]-1;
		pd+=x*x*(x%y+7)+y*y*y/(37-x)*jg+x^y*x*js;//fuckyoubitch
	}
	if(a<c){
		for(int i=1;i<=8;i++){
			dfs(x+D[i].h,y+D[i].z);
		}
	}
	else{
		for(int i=8;i>=1;i--){
			dfs(x+D[i].h,y+D[i].z);
		}
	}
	if(A[x][y]==2 || A[x][y]==1){
		js-=A[x][y];
		jg-=A[x][y]-1;
		pd-=x*x*(x%y+7)+y*y*y/(37-x)*jg+x^y*x*js;
	}
	vis[x][y]=0;
	stp--;
}
int main(){
	D[1]={1,2},D[2]={1,-2},D[3]={-1,2},D[4]={-1,-2},D[5]={2,1},D[6]={2,-1},D[7]={-2,1},D[8]={-2,-1},
	cin>>p>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			B[i][j]=1e9;
			cin>>A[i][j];
			if(A[i][j]==0) A[i][j]=1;
			else if(A[i][j]==1) A[i][j]=0;
			else if(A[i][j]==5) A[i][j]=2;
			else if(A[i][j]==2) A[i][j]=5;
			else if(A[i][j]==3) a=i,b=j;
			else if(A[i][j]==4) c=i,d=j;
			else continue;
		}
	}
	dfs(a,b);
	if(sw==0) cout<<"-1";
	else{
		cout<<s<<" "<<sw<<endl;
		if(g==0) cout<<"-1";
		else cout<<g<<" "<<wg;
	}
	return 0;
} 
2023/9/25 18:59
加载中...