驾驶卡丁车 模拟,迷宫(女赛)

在这里插入图片描述
思路 :

  • 起点记录后改为普通点
  • 给迷宫周围加一圈’#’
  • 速度作用是循环,如果循环内碰撞,就return了
  • 判断碰撞 :先是越界,还有’#’,然后就是斜向的判断了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <unordered_set>
 
using namespace std;

const int N = 55;

int n, m, q;
char g[N][N];
int sx, sy;
int v, dir;

int dx[] = {
    
    -1, -1, 0, 1, 1, 1, 0, -1};
int dy[] = {
    
    0, 1, 1, 1, 0, -1, -1, -1};

bool move(char ch)
{
    
    
    if (ch == 'L') dir = (dir + 7) % 8;
    if (ch == 'R') dir = (dir + 1) % 8;
    if (ch == 'U') v ++ ;
    if (ch == 'D') v = max(v - 1, 0);
    
    for (int i = 1; i <= v; i ++ )
    {
    
    
        int nx = sx + dx[dir], ny = sy + dy[dir];
        
        if (nx < 1 || nx > n || ny < 1 || ny > m || g[nx][ny] == '#') return false;
        
        if (dir == 1 && g[sx - 1][sy] == '#' && g[sx][sy + 1] == '#') return false;
        if (dir == 3 && g[sx + 1][sy] == '#' && g[sx][sy + 1] == '#') return false;
        if (dir == 5 && g[sx + 1][sy] == '#' && g[sx][sy - 1] == '#') return false;
        if (dir == 7 && g[sx - 1][sy] == '#' && g[sx][sy - 1] == '#') return false;
        
        sx = nx, sy = ny;
    }
    
    return true;
}
 
int main()
{
    
    
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
        {
    
    
            cin >> g[i][j];
            if (g[i][j] == '*') sx = i, sy = j, g[i][j] = '.';
        }
    
    cin >> q;
    for (int i = 1; i <= q; i ++ )
    {
    
    
        char ch;
        cin >> ch;
        if (move(ch)) cout << sx << ' ' << sy << endl;
        else
        {
    
    
            v = 0;
            cout << "Crash! " << sx << ' ' << sy << endl;
        }
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51448653/article/details/121245609
今日推荐