洛谷 P3956 棋盘__(刷题)bfs
题目:https://www.luogu.org/problemnew/show/P3956
这道题拿到的时候觉得有点难!!
确实是普及组的真题......没办法,硬着头皮做了!
有一个重要的推理过程:
魔法方面:如果你现在在红色上,下一个是空。如果下下个是红,那么肯定将空变成红色;
如果下下个是黄,那么空变为红再走上黄 -> 2+1=3;
黄走上去,再走上黄 -> (2+1)+0=3;
所以,无论如何,遇到空,都将它变为现在你所在的颜色^_^
dfs过程中:就不断地分情况就行了!!
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int xx[4]={-1,1,0,0}; 5 int yy[4]={0,0,-1,1}; 6 int a[101][101]; 7 int f[101][101]; 8 int n,m,x,y,t; 9 int ans=0x3f3f3f3f; 10 11 void dfs(int x,int y,int sum,bool is) 12 { 13 if (x<1||x>m||y<1||y>m) return; 14 if (sum >= f[x][y]) return; 15 if (x==m && y==m) 16 { 17 ans = min(ans,sum); 18 return; 19 } 20 f[x][y]=sum; 21 for(int i=0;i<4;i++) 22 { 23 int dx=x+xx[i]; 24 int dy=y+yy[i]; 25 if (a[dx][dy]) 26 { 27 if (a[dx][dy]==a[x][y]) dfs(dx,dy,sum,0); 28 else dfs(dx,dy,sum+1,0); 29 } 30 else if (!a[dx][dy]&&!is) 31 { 32 a[dx][dy]=a[x][y]; 33 dfs(dx,dy,sum+2,1); 34 a[dx][dy]=0; 35 } 36 } 37 } 38 int main(){ 39 scanf("%d%d",&m,&n); 40 f[1][1]=0; 41 memset(f,127,sizeof(f)); 42 for (int i=1;i<=n;i++) 43 { 44 scanf("%d%d%d",&x,&y,&t); 45 a[x][y]=t+1; 46 } 47 48 dfs(1,1,0,0); 49 if(ans!=0x3f3f3f3f) printf("%d",ans); 50 else printf("-1"); 51 return 0; 52 }
谢谢^_^;