记录编号 507767 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2017PJ]棋盘 最终得分 100
用户昵称 GravatarChtholly 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2018-09-03 08:59:16 内存使用 0.40 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define maxn 201
using namespace std;
int move[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int n,m,X,Y,T;
int min_value[maxn][maxn],color[maxn][maxn];
int total(int col ,int x ,int y){
	if(color[x][y]==col) return 0;
	if(color[x][y]==-1) return 2;
	return 1;
}
void dfs(int x,int y,int value,int jud){
	int next_x,next_y,next_value;
	if(value>=min_value[x][y]) return ;
	min_value[x][y]=value;
	if(x==m&&y==m) return ;
	for(int i=0;i<4;i++){
		next_x=x+move[i][0]; 
		next_y=y+move[i][1];
		next_value=value+total(color[x][y],next_x,next_y);
		if(next_x>=1&&next_y>=1&&next_x<=m&&next_y<=m){
			bool pd=0;
			if(next_value==value+2) 
				if(jud) continue;
				else pd=1,color[next_x][next_y]=color[x][y];
				dfs(next_x,next_y,next_value,pd);
				if(pd) color[next_x][next_y]=-1;
		}
	}
}
int main()
{
	freopen("checkerboard.in","r",stdin);
	freopen("checkerboard.out","w",stdout);
	scanf("%d%d",&m,&n);
	memset(color,-1,sizeof(color));
	memset(min_value,0x7f,sizeof(min_value));
	for(int i=1;i<=n;i++)
		scanf("%d%d%d",&X,&Y,&T),color[X][Y]=T;
	dfs(1,1,0,0);
	if(min_value[m][m]>200000) cout<<"-1";
	else cout<<min_value[m][m];
	return 0;
}
/*
5 7
1 1 0
1 2 0
2 2 1
3 3 1
3 4 0
4 4 1
5 5 0
*/