记录编号 507767 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2017PJ]棋盘 最终得分 100
用户昵称 GravatarChtholly 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2018-09-03 08:59:16 内存使用 0.40 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define maxn 201
  3. using namespace std;
  4. int move[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
  5. int n,m,X,Y,T;
  6. int min_value[maxn][maxn],color[maxn][maxn];
  7. int total(int col ,int x ,int y){
  8. if(color[x][y]==col) return 0;
  9. if(color[x][y]==-1) return 2;
  10. return 1;
  11. }
  12. void dfs(int x,int y,int value,int jud){
  13. int next_x,next_y,next_value;
  14. if(value>=min_value[x][y]) return ;
  15. min_value[x][y]=value;
  16. if(x==m&&y==m) return ;
  17. for(int i=0;i<4;i++){
  18. next_x=x+move[i][0];
  19. next_y=y+move[i][1];
  20. next_value=value+total(color[x][y],next_x,next_y);
  21. if(next_x>=1&&next_y>=1&&next_x<=m&&next_y<=m){
  22. bool pd=0;
  23. if(next_value==value+2)
  24. if(jud) continue;
  25. else pd=1,color[next_x][next_y]=color[x][y];
  26. dfs(next_x,next_y,next_value,pd);
  27. if(pd) color[next_x][next_y]=-1;
  28. }
  29. }
  30. }
  31. int main()
  32. {
  33. freopen("checkerboard.in","r",stdin);
  34. freopen("checkerboard.out","w",stdout);
  35. scanf("%d%d",&m,&n);
  36. memset(color,-1,sizeof(color));
  37. memset(min_value,0x7f,sizeof(min_value));
  38. for(int i=1;i<=n;i++)
  39. scanf("%d%d%d",&X,&Y,&T),color[X][Y]=T;
  40. dfs(1,1,0,0);
  41. if(min_value[m][m]>200000) cout<<"-1";
  42. else cout<<min_value[m][m];
  43. return 0;
  44. }
  45. /*
  46. 5 7
  47. 1 1 0
  48. 1 2 0
  49. 2 2 1
  50. 3 3 1
  51. 3 4 0
  52. 4 4 1
  53. 5 5 0
  54. */