Patrol Robot UVA - 1600

版权声明:欢迎转载!拒绝抄袭. https://blog.csdn.net/qq_36257146/article/details/88283116
#include <iostream>
#include <bits/stdc++.h>
#define maxn 21
using namespace std;

struct Node
{
    int r,c,k;
    Node(int a,int b,int d):r(a),c(b),k(d) {}
    Node() {}
};
int maze[maxn][maxn];
int dr[4] = {0,-1,0,1};
int dc[4] = {-1,0,1,0};
int m,n,k;
bool vis[maxn][maxn][maxn];
Node p[maxn][maxn][maxn];

bool bound(int r,int c)
{
    return r<=m&&r>=1&&c<=n&&c>=1;
}


void BFS(Node u)
{
    int r1,c1,k1 = 0;
    queue<Node>q;
    q.push(u);
    r1 = u.r;
    c1 = u.c;
    vis[r1][c1][k1] = 1;
    while(!q.empty())
    {
        Node v = q.front();
        q.pop();
        if(v.r == m && v.c == n)
        {
            cout<<"d"<<endl;
            return;
        }
        for(int i = 0; i<4; i++)
        {
            r1 = v.r+dr[i];
            c1 = v.c+dc[i];
            if(maze[r1][c1])
            {
                if(maze[v.r][v.c])
                    k1 = v.k+1;
                else
                    k1 = 1;
            }
            else
            {
                k1 = 0;
            }
            if(!vis[r1][c1][k1]&&k1<=k&&bound(r1,c1))
            {
                vis[r1][c1][k1] = 1;
                p[r1][c1][k1] = v;
                q.push(Node(r1,c1,k1));
                if(r1 == m && c1 == n)
                {
                    return ;
                }
            }
        }
    }
}

int main()
{
    int T;
    int r2,c2,k2;
    int ans,flag;
    Node u;
    cin>>T;
    while(T--)
    {
        ans = 0;
        flag = 0;
        cin>>m>>n>>k;
        memset(vis,0,sizeof(vis));
        memset(p,0,sizeof(p));
        for(int i = 1; i<=m; i++)
            for(int j = 1; j<=n; j++)
                cin>>maze[i][j];
        BFS(Node(1,1,0));
        r2 = m;
        c2 =n;
        for(int i = k;i>=0;i--)
        {
            if(vis[r2][c2][i])
            {
                flag = 1;
                k2 = i;
                break;
            }
        }
        if(!flag) ans = -1;
        else
        {
            while(!(r2 == 1 && c2 == 1))
            {
                u = p[r2][c2][k2];
                r2 = u.r;
                c2 = u.c;
                k2 = u.k;
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
/**
3
2 5
0
0 1 0 0 0
0 0 0 1 0
4 6
1
0 1 1 0 0 0
0 0 1 0 1 1
0 1 1 1 1 0
0 1 1 1 0 0
2 2
0
0 1
1 0
**/

猜你喜欢

转载自blog.csdn.net/qq_36257146/article/details/88283116