社区讨论

60分求条

P3956[NOIP 2017 普及组] 棋盘参与者 3已保存回复 25

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
25 条
当前快照
1 份
快照标识符
@mhizmlpa
此快照首次捕获于
2025/11/03 18:19
4 个月前
此快照最后确认于
2025/11/03 19:33
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int m,n,minn=2e9,u,v,w,vis[200][200],cd;//cd表示是否能使用魔法 
int nx[4]={0,0,1,-1},ny[4]={1,-1,0,0};//走向 
struct node{//1白 2红 3黄 
	int colour1;//原色
	int colour2;//用魔法改变的颜色 
}a[200][200];
void dfs(int x,int y,int corn){//corn是花费金币数
	if(x==m&&y==m){
		if(corn<minn){
			minn=corn;
		}
	} else{
		for(int i=0;i<4;i++){
			int bx=x+nx[i];
			int by=y+ny[i];
			if(bx>=1&&bx<=m&&by>=1&&by<=m&&vis[bx][by]==0){
				if(a[bx][by].colour1==a[x][y].colour1&&cd==0){
					vis[bx][by]=1;
					dfs(bx,by,corn);//费金币数不变 
					vis[bx][by]=0;//回溯 
				} else if(a[bx][by].colour1==a[x][y].colour2&&cd==1){//cd==1说明上一次使用魔法,所以比较colour2 
					vis[bx][by]=1;
					cd=0;//又可以使用魔法 
					dfs(bx,by,corn);
					cd=1;
					vis[bx][by]=0; 
				}else if(cd==0&&a[bx][by].colour1!=1){
					vis[bx][by]=1;
					dfs(bx,by,corn+1);//颜色不一样花费+1
					vis[bx][by]=0; 
				}else if(cd==1&&a[bx][by].colour1!=1){
					vis[bx][by]=1;
					cd=0;
					dfs(bx,by,corn+1);
					cd=1;
					vis[bx][by]=0;
				}else if(a[x][y].colour1!=1&&cd==0){//使用魔法 
					vis[bx][by]=1;
					cd=1;//魔法禁用
					a[bx][by].colour2=a[x][y].colour1;
					dfs(bx,by,corn+2);
					cd=0;
					vis[bx][by]=0; 
				}
			}
		}
	}
}
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[i][j].colour1=1;//先默认为白色 
		}
	} 
	while(n--){
		cin>>u>>v>>w;
		a[u][v].colour1=w+2;
	}//赋值
	vis[1][1]=1;
	dfs(1,1,0); 
	if(minn==2e9) cout<<-1;
	else cout<<minn;
}

回复

25 条回复,欢迎继续交流。

正在加载回复...