棋盘
一群人用广搜做,写了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"; }
......