C题是不是描述有问题,还是说数据有问腿
rt,第一份代码是没有加上向上走的,只过了43.3%
#include<bits/stdc++.h> #define int long long #pragma GCC optimize(2) using namespace std; const int N = 2e6 + 10; int times; int n,m; int arr[2010][2010],vis[2010][2010]; int dx[]={0,1,-1,0}; int dy[]={1,0,0,-1}; void solve() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)cin>>arr[i][j],vis[i][j]=N*N; vis[1][1]=0; queue<pair<int,int>>Q; Q.push({1,1}); while(Q.size()) { auto t = Q.front(); Q.pop(); for(int i=0;i<3;i++) { int sx = t.first+dx[i]; int sy = t.second+dy[i]; if(sx>=1&&sx<=n&&sy>=1&&sy<=m) { int value = 1+(arr[t.first][t.second]!=arr[sx][sy]); if(value+vis[t.first][t.second]<vis[sx][sy]) { vis[sx][sy] = value+vis[t.first][t.second]; Q.push({sx,sy}); } } } } cout<<vis[n][m]<<endl; } signed main() { std::ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); times=1; //cin >> times; while (times--) { solve(); } return 0; }
第二份代码,加上了可以向上的方向
#include<bits/stdc++.h> #define int long long #pragma GCC optimize(2) using namespace std; const int N = 2e6 + 10; int times; int n,m; int arr[2010][2010],vis[2010][2010]; int dx[]={0,1,-1,0}; int dy[]={1,0,0,-1}; void solve() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)cin>>arr[i][j],vis[i][j]=N*N; vis[1][1]=0; queue<pair<int,int>>Q; Q.push({1,1}); while(Q.size()) { auto t = Q.front(); Q.pop(); for(int i=0;i<4;i++) { int sx = t.first+dx[i]; int sy = t.second+dy[i]; if(sx>=1&&sx<=n&&sy>=1&&sy<=m) { int value = 1+(arr[t.first][t.second]!=arr[sx][sy]); if(value+vis[t.first][t.second]<vis[sx][sy]) { vis[sx][sy] = value+vis[t.first][t.second]; Q.push({sx,sy}); } } } } cout<<vis[n][m]<<endl; } signed main() { std::ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); times=1; //cin >> times; while (times--) { solve(); } return 0; }