#include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<stdio.h> const int INF=0x7f7f7f7f; using namespace std; int table[101][101]; int cost[101][101]; int m,n; void expand(int color,int flag,int c1,int c2,int d1,int d2); void solve(int f1,int f2,int c1,int c2){ int color,flag=0; if(!table[c1][c2]){ color=table[f1][f2]; flag=1; } else color=table[c1][c2]; if(c1!=1) expand(color,flag,c1,c2,c1-1,c2); if(c2!=1) expand(color,flag,c1,c2,c1,c2-1); if(c1!=m) expand(color,flag,c1,c2,c1+1,c2); if(c2!=m) expand(color,flag,c1,c2,c1,c2+1); } void expand(int color,int flag,int c1,int c2,int d1,int d2){ if(table[d1][d2]){ if(color==table[d1][d2]&&cost[d1][d2]>cost[c1][c2]){ cost[d1][d2]=cost[c1][c2]; solve(c1,c2,d1,d2); } if(color!=table[d1][d2]&&cost[d1][d2]>cost[c1][c2]+1){ cost[d1][d2]=cost[c1][c2]+1; solve(c1,c2,d1,d2); } } else{ if(!flag&&cost[d1][d2]>cost[c1][c2]+2){ cost[d1][d2]=cost[c1][c2]+2; solve(c1,c2,d1,d2); } } } int main(){ memset(cost,1,sizeof(cost)); int con=cost[1][1]; cost[1][1]=0; memset(table,0,sizeof(table)); cin>>m>>n; int a,b,c; for(int i=0;i<n;i++){ cin>>a>>b>>c; if(c) table[a][b]=2; else table[a][b]=1; } solve(1,1,1,1); if(cost[m][m]==con) cout<<-1<<endl; else cout<<cost[m][m]<<endl; return 0; }
Luogu P3956 棋盘
猜你喜欢
转载自www.cnblogs.com/Gsimt/p/9629906.html
今日推荐
周排行