DFS40分,求助,谢谢
查看原帖
DFS40分,求助,谢谢
538085
liysjianttso楼主2023/5/2 08:35

想法大概是DFS,用一个变量ma表示能否使用魔法(毕竟不能使用魔法时意味着临走前要恢复) 不确定哪里有问题,希望有大佬能帮忙看一看,衷心感谢

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define MAXN 0x7fffffff
using namespace std;
int m,n;
int a[1100][1100];//颜色
int bl[1100][1100];//是否走过
int ans,minum=MAXN;
int i,j,p,q,w;
int f[4][2] = {1,0, 0,1, -1,0, 0,-1};
int d[1100][1100];//各个格子的最小花费
//set<xy> mo;
//0:无色
void search(int x,int y,int c,int ma){
	//参数分别是:x,y,上一轮总花费,能否使用魔法
	//printf("%d %d %d %d %d\n",x,y,c,m,minum);
	if((x==m)&&(y==m)){
		minum=min(c,minum);
		return;
	}
	int p,q;
	for(int i = 0;i<4;i++){
		p = x+f[i][0];
		q = y+f[i][1];
		int now = a[x][y];
		if(!ma)a[x][y] = 0;//不能用魔法代表这一轮离开前要恢复当前的格子
		if(p<1||q<1||p>m||q>m)continue;
		if(!bl[p][q]){
			//没走过
			if(a[p][q]==0){
				if(ma&&d[p][q]>c+2){
					//目前所处的格子本来就有颜色
					bl[p][q] = 1;
					d[p][q]=c+2;
					a[p][q]=now;//使用魔法
					search(p,q,c+2,0);
					bl[p][q]=0;
				}
			}
			else if(a[p][q]==now&&d[p][q]>c){
				bl[p][q] = 1;
				d[p][q]  =c;
				search(p,q,c,1);
				bl[p][q] = 0;
			}
			else if(d[p][q]>c+1){
				bl[p][q] = 1;
				d[p][q] = c+1;
				search(p,q,c+1,1);
				bl[p][q] = 0;
			}
		}
		
			
		}
		
		
}

int main(){
	scanf("%d%d",&m,&n);
	
	for(i=1;i<=m;i++)
		for(j=1;j<=m;j++) d[i][j]=MAXN;
	
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",&q,&p,&w);
		a[q][p]=w+1;
	}
	bl[1][1]=1;
	search(1,1,0,1);
	if(minum==MAXN){
		printf("-1");
		return 0;
	}
	printf("%d",minum);
	return 0;
}
2023/5/2 08:35
加载中...