20分DFS求改
查看原帖
20分DFS求改
800322
Zouzhuoxuan楼主2023/1/14 20:13
#include<cstdio>
#include<string.h> 
#include<iostream>
using namespace std;
const int N=1e4;
int a[105][105],coinless=N*2,dx[]={0,1,-1,0,0},dy[]={0,0,0,-1,1},m,n;
bool vis[105][105];
void dfs(int x,int y,int coin,bool magic,int color)
{
	int gx,gy;
	if(coin>=coinless) return;
	if(x==m&&y==m)
	{
		coinless=min(coinless,coin);
		return;
	}
	for(int i=1;i<=4;i++)
	{
		gx=x+dx[i],gy=y+dy[i];
		if(gx<=0||gx>m||gy<=0||gy>m||(a[gx][gy]==-1&&magic)||vis[gx][gy]) continue;
		if(a[gx][gy]==-1)
		{
			vis[gx][gy]=true;
			dfs(gx,gy,coin+2,true,a[x][y]);
		}
		else if(a[gx][gy]=!a[x][y])
		{
			vis[gx][gy]=true;
			dfs(gx,gy,coin+1,false,a[gx][gy]);
		}
		else
		{
			vis[gx][gy]=true;
			dfs(gx,gy,coin,false,a[gx][gy]);
		}
	}
	return;
}
int main()
{
	memset(vis,false,sizeof(vis));
	memset(a,-1,sizeof(a));
	int i,tmp1,tmp2,tmp3;
	scanf("%d%d",&m,&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",&tmp1,&tmp2,&tmp3);
		a[tmp1][tmp2]=tmp3;
	}
	vis[1][1]=true;
	dfs(1,1,0,false,a[1][1]);
	if(coinless==N*2) printf("-1\n");
	else printf("%d\n",coinless);
}
2023/1/14 20:13
加载中...