Lianliankanゲームアシスタント

Lianliankanゲームアシスタント

トピック情報

「リアンリアンカン」はパズルゲームです。
同じ2枚のカードを3本の直線で結ぶことで「リアンリアンカン」をなくすことができます。ルールはシンプルで使いやすいです。
この質問は、Lianliankanのゲームをしている人をシミュレートするために書かれており、Lianliankanをしている人をシミュレートするコンピューターのプロセスは、次のとおりです
。1。このゲームのゲームを分析し、ゲームを2桁の配列に変換します。0は空白の領域を示し、数字はゲームに表示されるゲームカードの種類を示します。
2.幅優先探索アルゴリズムを使用して、2枚のゲームカードを排除できるかどうかを判断します。
3.プログラムシミュレーターは、除去するために除去できるゲームカードのペアをクリックします。
次のように、ゲームを2次元配列に変換します。000
0 0
0 1 2 0 0
0 0 3 4 0
0 0 0 1 0

入る

2桁の配列、2桁の配列、開始要素の座標、および終了要素の座標の行と列によって、開始ゲームカードと終了ゲームカードを削除できるかどうかが決まります。

出力

正しいか間違っているか

テストサンプル

テスト例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