BFS做法:用队列。
注意事项:
1.设的结构体只有一个。
2.标记函数在此题中是三维,第三维代表着走过了多少个1.

#include <cstdio>
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int m,n,k,ans;

int a[30][30];
int b[30][30][30];

struct sss
{
    int shu;
    int heng;
    int step;
    int jishu;
}l;

int shu1[10] ={0,1,-1,0,0};
int heng1[10]={0,0,0,1,-1};

void bfs()
{
    queue<sss>ss;
    ss.push(sss{1,1,0,0});
    while (!ss.empty())
    {
        l=ss.front();
        ss.pop();
        if(l.shu==m&&l.heng==n)
        {
            ans=l.step;
            break;
        }
        if(a[l.shu][l.heng]==0)
        {
            l.jishu=0;
        }
        if(b[l.shu][l.heng][l.jishu]==0)
        {
            b[l.shu][l.heng][l.jishu]=1;
            for (int i=1;i<=4;i++)
            {
                int s=l.shu+shu1[i];
                int h=l.heng+heng1[i];

                if(s>=1&&h>=1&&s<=m&&h<=n)
                {
                    if(a[s][h]==0&&b[s][h][l.jishu]==0)
                    {
                        ss.push(sss{s,h,l.step+1,l.jishu});
                    }
                    if(a[s][h]==1&&l.jishu<k&&b[s][h][l.jishu+1]==0)
                    {
                        ss.push(sss{s,h,l.step+1,l.jishu+1});
                    }
                }
            }
        }
    }
    while (!ss.empty()) ss.pop();
}
int main ()
{
    int T;
    cin >> T;
    for (int I=1;I<=T;I++)
    {

        cin >> m >> n >> k;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        ans=-1;
        for (int i=1;i<=m;i++)
        {
            for (int j=1;j<=n;j++)
            {
                cin >> a[i][j];
            }
        }
        bfs();
        cout << ans << endl;
    }
    return 0;
}