P3956 棋盘——普及题,儿童搜索
这道搜索弄得我很难受。
第一,一定要看清楚题在写。第二,弄清楚判断条件;
首先图的大小是m*m不是n*m;
然后就是当前有颜色的点是不用变颜色的;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1010; int f[maxn][110]; int n,m; int mp[maxn][110]; int ans=2147483647; int xx[4]={0,0,1,-1}; int yy[4]={1,-1,0,0}; void dfs(int x,int y,int sum,int flag) { if(sum>=f[x][y]) return ; f[x][y]=sum; if(x==m&&y==m) { ans=min(ans,sum); return ; } for(int i=0;i<4;i++) { int fx=x+xx[i]; int fy=y+yy[i]; if(fx<1||fx>m||fy<1||fy>m) continue ; if(mp[fx][fy]) { if(mp[fx][fy]==mp[x][y]) { dfs(fx,fy,sum,0); } else dfs(fx,fy,sum+1,0); } else if(!flag) { mp[fx][fy]=mp[x][y]; dfs(fx,fy,sum+2,1); mp[fx][fy]=0; } } } int main() { memset(f,0x7f,sizeof(f)); scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(z==1) mp[x][y]=1; else if(z==0) mp[x][y]=2; } dfs(1,1,0,0); if(ans==2147483647) printf("-1"); else printf("%d",ans); return 0; }