棋盘
一群人用广搜做,写了180多行的代码......我的深搜只写了85行......代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int a[1100][1100],y1[4]={1,-1,0,0},x1[4]={0,0,1,-1};
int ans[1100][1100];
int x,y,z;
void sou(int x,int y,int k)
{
for(int i=0;i<=3;i++)
{
int h1=x+x1[i],h2=y+y1[i];
if(h1<1||h1>n||h2<1||h2>n) continue;//判断越界
if(a[h1][h2]!=0)//如果有颜色
{
if(a[x][y]==0)
{
if(k==a[h1][h2])//颜色一样
{
if(ans[h1][h2]>ans[x][y])
{
ans[h1][h2]=ans[x][y];
sou(h1,h2,a[x][y]);
}
}
else
{
if(ans[h1][h2]>ans[x][y]+1)//颜色不一样,+1
{
ans[h1][h2]=ans[x][y]+1;
sou(h1,h2,a[x][y]);
}
}
}
else
{
if(a[h1][h2]==a[x][y])
{
if(ans[h1][h2]>ans[x][y])
{
ans[h1][h2]=ans[x][y];
sou(h1,h2,a[x][y]);
}
}
else
{
if(ans[h1][h2]>ans[x][y]+1)
{
ans[h1][h2]=ans[x][y]+1;
sou(h1,h2,a[x][y]);
}
}
}
}
else//没颜色
{
if(a[x][y]==0) continue;
if(ans[h1][h2]>=ans[x][y]+2)//花两块钱
{
ans[h1][h2]=ans[x][y]+2;
sou(h1,h2,a[x][y]);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
a[x][y]=z+1;//我从一开始
}
memset(ans,127,sizeof(ans));//初始化
ans[1][1]=0;
sou(1,1,1);
if(ans[n][n]!=2139062143)
{
cout<<ans[n][n];
}
else cout<<"-1";
}
......

浙公网安备 33010602011771号