洛谷 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 }

谢谢^_^;

猜你喜欢

转载自www.cnblogs.com/pengcheng-official/p/9497345.html