#include<bits/stdc++.h>
using namespace std;
//思路:四方向搜索
//没有提到不能反复走,但是仍需标记不然会超时
//我一开始并没有想到要标记,我想的是通过限制总的循环次数避免死循环,但这样显然是不对的
//在常规的dfs或者bfs时,我们通过标记确保不重复访问,是对于每个点来说,当再次走到这个点时我们会面临同样的
//选择,这是一维的,这个题是k维的。对于同一个点不会是仅有一种情况,可能是第1-k步走到这个点,当我们在相同
//的情况下再走到这个点时,我们会面临相同的选择。一维只有一种情况
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<char>>graph(n, vector<char>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> graph[i][j];
}
}
vector<vector<vector<bool>>>isvis(n, vector<vector<bool>>(m, vector<bool>(k + 1)));
queue<tuple<int, int, int,int>>q;//存储坐标,第个格子,当前步数
q.push({ 0,0,1,0});
int ans = -1;
while (!q.empty()) {
int x = get<0>(q.front()),y=get<1>(q.front()),t=get<2>(q.front()),step=get<3>(q.front());
q.pop();
if (x == n - 1 && y == m - 1) {
ans = step;
break;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (t == k && graph[x][y] != graph[nx][ny] && isvis[nx][ny][1] == false) {//需要换字母
q.push({ nx,ny,1,step + 1 });
isvis[nx][ny][1] = true;
}
else if (t < k && graph[x][y] == graph[nx][ny] && isvis[nx][ny][t + 1] == false) {
q.push({ nx,ny,t + 1,step + 1 });
isvis[nx][ny][t + 1] = true;
}
}
}
}
cout << ans;
return 0;
}
确实有进步哈