```cpp
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
#include <algorithm>
using namespace std;
int tu[105][105],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool pao[105][105];
int m,n,num=100000000;
void dfs(int x,int y,int ans){
if(ans>=num)return;
if(x==m&&y==m){
num=min(ans,num);
return;
}
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(pao[a][b])continue;
if(a<1||b<1||a>m||b>m)continue;
if(tu[x][y]==0&&tu[a][b]==0)continue;
pao[a][b]=1;
if(tu[x][y]==0&&tu[a][b]!=0)dfs(a,b,ans);
else if(tu[x][y]!=0&&tu[a][b]==0)dfs(a,b,ans+2);
else if(tu[x][y]==tu[a][b]){
dfs(a,b,ans);
}else{
dfs(a,b,ans+1);
}
pao[a][b]=0;
}
return;
}
int main() {
cin>>m>>n;
pao[1][1]=1;
int a,b,c;
for(int i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
tu[a][b]=c+1;
}
dfs(1,1,0);
if(num==100000000){
cout<<"-1"<<endl;
}
else cout<<num<<endl;
return 0;
}
```
by 谬悠 @ 2019-08-31 20:57:24
[蒟蒻惨状](https://www.luogu.org/record/23537661)
by 谬悠 @ 2019-08-31 20:59:04
~~我居然写过这道题~~
不管了 丢上我的爆搜
~~~c++
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dwn(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int n,m,a[1010][1010],d[1010][1010],temp[1010][1010];
int dictx[4]={1,-1,0,0},dicty[4]={0,0,1,-1};
queue<P> que;
void bfs()
{
d[1][1]=0;
que.push(P(1,1));
while(!que.empty())
{
int x=que.front().first,y=que.front().second;
que.pop();
if(x*y==0) continue;
for(int i=0;i<4;++i)
{
int dx=dictx[i],dy=dicty[i];
if(a[x+dx][y+dy]==0&&a[x][y]!=0)
{
if(d[x+dx][y+dy]>d[x][y]+2)
{
d[x+dx][y+dy]=d[x][y]+2;
temp[x+dx][y+dy]=a[x][y];
que.push(P(x+dx,y+dy));
}
else if(d[x+dx][y+dy]==d[x][y]+2)
{
if(temp[x+dx][y+dy]!=a[x][y])
temp[x+dx][y+dy]=10;
}
}
if(a[x+dx][y+dy]!=0&&a[x][y]!=0&&a[x][y]!=a[x+dx][y+dy])
{
if(d[x+dx][y+dy]>d[x][y]+1)
{
d[x+dx][y+dy]=d[x][y]+1;
que.push(P(x+dx,y+dy));
}
}
if(a[x+dx][y+dy]!=0&&a[x][y]==0)
{
if(temp[x][y]==a[x+dx][y+dy]||temp[x][y]==10)
{
if(d[x+dx][y+dy]>d[x][y])
{
d[x+dx][y+dy]=d[x][y];
que.push(P(x+dx,y+dy));
}
}
else if(temp[x][y]!=0)
{
if(d[x+dx][y+dy]>d[x][y]+1)
{
d[x+dx][y+dy]=d[x][y]+1;
que.push(P(x+dx,y+dy));
}
}
//temp[x][y]==0;
}
if(a[x+dx][y+dy]!=0&&a[x][y]!=0&&a[x][y]==a[x+dx][y+dy])
{
if(d[x+dx][y+dy]>d[x][y])
{
d[x+dx][y+dy]=d[x][y];
que.push(P(x+dx,y+dy));
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(d,127,sizeof(d));
rep(i,1,m)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[x][y]=z+1;
}
bfs();
if(d[n][n]!=d[0][0])
{
printf("%d\n",d[n][n]);
}
else printf("-1\n");
return 0;
}
~~~
by ZhuMingYang @ 2019-08-31 21:03:09
@[ZhuMingYang](/space/show?uid=128523)
大佬能帮忙看看程序吗,我感觉思路蛮好的QAQ
by 谬悠 @ 2019-08-31 21:04:38
@[谬悠](/space/show?uid=234271) 调试要自己调哦
by ZhuMingYang @ 2019-08-31 21:07:19
@[ZhuMingYang](/space/show?uid=128523) 我懵逼了QAQ
by 谬悠 @ 2019-08-31 21:07:57
```cpp
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
#include <algorithm>
using namespace std;
int tu[105][105],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int pao[105][105];
int m,n,num=0x7fffffff;
void dfs(int x,int y,int ans){
if(ans>=pao[x][y])return;
pao[x][y]=ans;
if(x==m&&y==m){
num=min(ans,num);
return;
}
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a<1||b<1||a>m||b>m)continue;
if(tu[x][y]==0&&tu[a][b]==0)continue;
if(tu[x][y]==0&&tu[a][b]!=0)dfs(a,b,ans);
else if(tu[x][y]!=0&&tu[a][b]==0)dfs(a,b,ans+2);
else if(tu[x][y]==tu[a][b]) dfs(a,b,ans);
else dfs(a,b,ans+1);
}
return;
}
int main() {
memset(pao,0x7f,sizeof(pao));
cin>>m>>n;
int a,b,c;
for(int i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
tu[a][b]=c+1;
}
dfs(1,1,0);
if(num==0x7fffffff){
cout<<"-1"<<endl;
}
else cout<<num<<endl;
return 0;
}
```
by 谬悠 @ 2019-08-31 21:25:34
25分懵逼
by 谬悠 @ 2019-08-31 21:25:42
@[谬悠](/space/show?uid=234271)
if(tu[x][y]==0&&tu[a][b]!=0)dfs(a,b,ans);
这句话应当是有问题的,
tu[x][y] == 0 说明现在这个格子是无色的,而可以站上去是因为它被暂时变成了上一次变它的颜色(即转移到(x,y)的格子的颜色)。
而tu[a][b] != 0则有红和黄两种情况,无法确定是否和(x,y)被变的颜色一致,如果颜色不同是不能走的,所以不能直接搜下去。
可以考虑多一个参数来记颜色。
TLE的问题开记忆化可以解决。
by vzyx @ 2019-08-31 21:26:59
@[vzyx](/space/show?uid=136985) 欸?
请问
不是可以吧无色改变成任何颜色吗
那么红 白 黄用两个金钱不就可以了吗QAQ
by 谬悠 @ 2019-08-31 21:29:18