ZOJ 3865 Superbot

来源:互联网 发布:单片机 蓝牙 app 编辑:程序博客网 时间:2024/06/17 03:54

解题思路:

简单的bfs, 记录一下当前的键盘状态。

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#define ll long longusing namespace std;int Move[][2] = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };int dp[20][20][5];char g[20][20];int ex, ey;int n, m, p;struct Point{    int x, y, dir;    Point(int _x = 0, int _y = 0, int _dir = 0)    {        x = _x;        y = _y;        dir = _dir;    }};bool check(int x, int y){    if(x < 0 || x >= n || y < 0 || y >= m)        return false;    if(g[x][y] == '*') return false;    return true;}int bfs(int sx, int sy){    //cout << sx << ' ' << sy << ' ' << endl;   // cout << ex << ' ' << ey << ' ' << endl;    memset(dp, -1, sizeof(dp));    queue<Point>Q;    Q.push(Point(sx, sy, 0));    dp[sx][sy][0] = 0;    while(!Q.empty())    {        Point pre = Q.front();        Q.pop();        int px = pre.x;        int py = pre.y;        int pd = pre.dir;        if(px == ex && py == ey)            return dp[ex][ey][pd];        int nx, ny, nd;        //什么都不做        nx = px, ny = py, nd = pd;        if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p - 1)//如果恰好键盘转动            nd = (nd + 3) % 4;        if(dp[nx][ny][nd] == -1)        {            dp[nx][ny][nd] = dp[px][py][pd] + 1;            Q.push(Point(nx, ny, nd));        }        //按下当前的键        nx = px + Move[pd][0];        ny = py + Move[pd][1];        nd = pd;        if(check(nx, ny))        {            if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p - 1)                nd = (nd + 3) % 4;            if(dp[nx][ny][nd] == -1)            {                dp[nx][ny][nd] = dp[px][py][pd] + 1;                Q.push(Point(nx, ny, nd));            }        }        //向左移动键盘        nx = px;        ny = py;        nd = (pd + 3) % 4;        if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p-1)            nd = (nd + 3) % 4;        if(dp[nx][ny][nd] == -1)        {            dp[nx][ny][nd] = dp[px][py][pd] + 1;            Q.push(Point(nx, ny, nd));        }        //向右移动键盘        nx = px;        ny = py;        nd = (pd + 1) % 4;        if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p-1)            nd = (nd + 3) % 4;        if(dp[nx][ny][nd] == -1)        {            dp[nx][ny][nd] = dp[px][py][pd] + 1;            Q.push(Point(nx, ny, nd));        }    }    return -1;}int main(){    int T;    scanf("%d", &T);    while(T--)    {        scanf("%d%d%d", &n, &m, &p);        int sx, sy;        for(int i=0;i<n;i++)            scanf("%s", g[i]);        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(g[i][j] == '@')                {                    sx = i;                    sy = j;                }                if(g[i][j] == '$')                {                    ex = i;                    ey = j;                }            }        }        //cout << sx << ' ' << sy << ' ' << endl;        int ans = bfs(sx, sy);        if(ans == -1) printf("YouBadbad\n");        else printf("%d\n", ans);    }    return 0;}

0 0
原创粉丝点击