牛客小白月赛75

D:给定01矩阵,规定0可以到1,1可以到0,将当前1变为0,将当前0变为1,花费都是1

问从(1,1)走到(n,m)花费是多少,前提是移动都是相邻的点

 

 

考虑bfs,需要处理的是把当前点转化这个问题,其实可以分两种情况,对于相邻的点来说判断当前点和相邻点的点数是否相同而赋予两点之间的权值,不相邻的点也是一样,通过到达中继点来处理这个问题,就变的轻松很多,当初拿到这个题居然还想用dp处理,但是这样的情况通过看一组需要四方向移动的就可以排除

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<string>
 6 #include<vector>
 7 #include<stack>
 8 #include<bitset>
 9 #include<cstdlib>
10 #include<cmath>
11 #include<set>
12 #include<list>
13 #include<deque>
14 #include<map>
15 #include<queue>
16 #include <iomanip>
17 #include<ctime>
18 using namespace std;
19 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
20 #define TLE (double)clock()/CLOCKS_PER_SEC<=0.95
21 //#define int long long 
22 #define double long double
23 #define endl '\n'
24 #define inf LLONG_MAX
25 #define iinf INT_MAX
26 typedef pair<int,int> PII;
27 const double PI = acos(-1.0);
28 const double eps = 1e-6;
29 const int INF = 0x3f3f3f3f;
30 const int N = 1e3+10;
31 int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
32 // int dp[N][N][2];
33 char a[N][N];
34 // bool vis[N][N];
35 int dis[N][N];
36 int n,m;
37 void bfs(int x,int y)
38 {
39     queue<PII>q;
40     dis[x][y]=0;
41     q.push({x,y});
42     while(!q.empty())
43     {
44         int tx=q.front().first;
45         int ty=q.front().second;
46         q.pop();
47         for(int i=0;i<4;i++)
48         {
49             int nx=tx+dx[i];
50             int ny=ty+dy[i];
51             if(nx<1||nx>n||ny<1||ny>m)    continue;
52             int tt=nx+ny;
53             int w=0;
54             if(tt&1){//判断是否相邻
55                 if(a[nx][ny]==a[1][1])    w=2;//如果是同样的数字,则现需要修改相邻数字然后在走过去花费2
56                 else w=1;//直接过去花费1
57             }
58             else//不相邻
59             {
60                 if(a[nx][ny]==a[1][1])    w=1;//经过中继点然后在过去是1
61                 else w=2;//和中继点数字一样则现需要修改相邻数字然后在走过去花费2
62             }
63             if(dis[nx][ny]>dis[tx][ty]+w)//更新
64             {
65                 dis[nx][ny]=dis[tx][ty]+w;
66                 q.push({nx,ny});
67             }
68         }
69     }
70 }
71 int main()
72 {
73     IOS;
74     cin>>n>>m;
75     for(int i=1;i<=n;i++)
76     {
77         for(int j=1;j<=m;j++)
78         {
79             cin>>a[i][j];
80         }
81     }
82     // memset(dp,inf,sizeof dp);
83     // dp[1][1][0]=dp[1][1][1]=0;
84     // for(int i=1;i<=n;i++)
85     // {
86         // for(int j=1)
87     // }
88     //
89     memset(dis,0x3f,sizeof dis);
90     bfs(1,1);
91     cout<<dis[n][m]<<endl;
92     return 0;
93 }

 

 

E:没思路,找个时间补

posted @ 2023-07-02 13:34  江上舟摇  阅读(13)  评论(0编辑  收藏  举报