Lianliankan Game Assistant

Информация по теме

«Lianliankan» - игра-головоломка.
«Lianliankan» можно исключить, соединив те же две карты тремя прямыми линиями.Правила просты и удобны в использовании.
Этот вопрос написан для моделирования человека, играющего в Lianliankan, и процесс компьютерного моделирования человека, играющего в Lianliankan, выглядит следующим образом:
1. Проанализируйте игру в этой игре и преобразуйте игру в двузначный массив. 0 указывает на пустую область, а число указывает на тип игровой карты, которая появляется в игре.
2. Используйте алгоритм поиска в ширину, чтобы определить, можно ли удалить две игровые карты.
3. Программа-симулятор щелкает по паре игровых карт, которые можно удалить, чтобы исключить.
Преобразуйте игру в двумерный массив следующим образом:
0 0 0 0 0
0 1 2 0 0
0 0 3 4 0
0 0 0 1 0

войти

Строки и столбцы двузначного массива, двузначного массива, координаты начального элемента и координаты конечного элемента определяют, можно ли удалить начальную игровую карту и конечную игровую карту.

Вывод

ПРАВДА ИЛИ ЛОЖЬ

Проба

Пример теста 1

4 5
0 0 0 0 0 0 1 2 0 0 0 0 3 4 0 0 0 0 1 0
1 1
3 3
TRUE

Пример теста 2

5 6
0 0 0 0 0 0 0 1 2 3 0 0 3 0 0 0 0 3 0 2 3 4 0 2 0 0 0 2 1 4
1 1
4 4
TRUE

Пример теста 3

5 6
0 0 0 0 0 0 0 1 2 3 0 0 3 0 0 0 0 3 0 2 3 4 0 2 0 0 0 2 1 4
3 3
4 5
FALSE

ответ

#include<iostream>
#include<queue>

using namespace std;

int Map[1000][1000] = {
    
    0};
int vir[1000][1000] = {
    
    0};
int m, n, StartX, StartY, EndX, EndY;
int trend[4][2] = {
    
    {
    
    0,  1},
                   {
    
    0,  -1},
                   {
    
    1,  0},
                   {
    
    -1, 0}};//0-下,1-上,2-右,3-左
struct Node
{
    
    
    int x, y;//坐标
    int dir; //方向
    int turn;//转弯次数
};

void BFS()
{
    
    
    queue<Node> q;
    Node k0, k1, t0;
    bool flag = false;
    for (int i = 0; i < 4; i++)
    {
    
    //初始化四个方向的点
        t0.x = StartX + trend[i][0];
        t0.y = StartY + trend[i][1];
        t0.dir = i;
        t0.turn = 1;
        vir[t0.x][t0.y] = t0.turn;
        q.push(t0);
    }
    while (!q.empty())
    {
    
    //在队列中开始广度优先搜索
        k0 = q.front();
        q.pop();
        if (k0.x == EndX && k0.y == EndY)
        {
    
    //找到了终点
            flag = true;
            cout << "TRUE" << endl;
            break;
        }
        for (int i = 0; i < 4; i++)
        {
    
    //对当前点遍历四个方向
            k1.x = k0.x + trend[i][0];
            k1.y = k0.y + trend[i][1];
            k1.dir = i;
            if (k1.dir != k0.dir)
            {
    
    //方向发生改变则相当于转弯了
                k1.turn = k0.turn + 1;
            }
            else
            {
    
    
                k1.turn = k0.turn;
            }

            if (k1.turn > 3 || k1.x < 0 || k1.y < 0 || k1.x > m - 1 || k1.y > n - 1)
            {
    
    //如果边树大于三条边了或者是超出地图范围了就不考虑了直接下一个
                continue;
            }
            if (Map[k1.x][k1.y] != 0 && Map[k1.x][k1.y] != Map[EndX][EndY])
            {
    
    //如果在地图上这个点不是0且不是终点,相当于走不通,也不考虑了直接下一个
                continue;
            }
            if (vir[k1.x][k1.y] == 0 || vir[k1.x][k1.y] >= k1.turn)
            {
    
    //如果是个未访问对点,或者是转向角度低于图中的点。
                //因为图中转向角度大的点相当于已经访问过了,甚至是已经到3不符合要求的点
                vir[k1.x][k1.y] = k1.turn;//更新我们刚算的转向值
                q.push(k1);//并压入队列等待下一轮判定
            }
        }
    }
    if (!flag)
    {
    
    
        cout << "FALSE" << endl;
    }
}

int main()
{
    
    
    //freopen("/Users/zhj/Downloads/test.txt", "r", stdin);
    cin >> m >> n;
    for (int i = 0; i < m; i++)
    {
    
    
        for (int j = 0; j < n; j++)
        {
    
    
            cin >> Map[i][j];
        }
    }
    cin >> StartX >> StartY >> EndX >> EndY;
    BFS();
    return 0;
}

рекомендация

отblog.csdn.net/zhj12399/article/details/110002379