您的位置:首页 > 其它

(计蒜客)蓝桥杯模拟赛(B组)第三题 连连看

2018-03-26 09:28 288 查看
连连看是一款非常有意思的游戏。

我们可以把任意两个在图的在边界上的相同的方格一起消掉,比如把两个 44 消掉以后,



每次消掉两个方格的时候,都有会获得一个分数,第 ii 次消的分数为 i \timesi× 方格的值。比如上面的消法,是第一次消,获得的分数为 1 \times 4 = 41×4=4。请你帮忙最优操作情况下,获得的分数最多为多少。有点暴力但我也想不出好办法了。。。想出来再写思路:因为不会找边界所以开了一个结构体内部装入标记是边界的数组和一个图和一个分数一个步数然后广搜#include<iostream>
#include<stdio.h>
#include<cstring>
#include<queue>
using namespace std;
const int MAP[6][6]={{0,0,0,0,0,0},{0,1,4,2,5,0},{0,2,1,2,2,0},{0,3,1,3,1,0},{0,2,5,3,4,0},{0,0,0,0,0,0}};
struct biao
{
    int Map[6][6];
    bool vis[6][6];
    int fen;
    int step;
}NOW,NEXT;
int BFS ()
{
    queue<biao>q;
    memset(NOW.vis,0,sizeof(NOW.vis));
    for(int i = 1; i &
4000
lt;= 4; i++)
    {
        NOW.vis[1][i] = true;
        NOW.vis[i][1] = true;
        NOW.vis[4][i] = true;
        NOW.vis[i][4] = true;
    }
    NOW.fen = 0;
    for(int i = 0; i < 6; i++)
    {
    for(int j = 0; j < 6; j++)
    {
    NOW.Map[i][j] = MAP[i][j];
}
}
    NOW.step=1;
    q.push(NOW);
    int MAX = 0;
    while(!q.empty())
    {
        NOW = q.front();
        q.pop();
        if(NOW.fen > MAX)
        {
            MAX = NOW.fen;
        }
        for(int i = 1; i <= 4; i++)
        {
            for(int j = 1; j <= 4; j++)
            {
                if(NOW.vis[i][j])
                {
                    for(int h =1; h <= 4; h++)
                    {
                        for(int k = 1; k <= 4; k++)
                        {
                            if(NOW.Map[h][k] == NOW.Map[i][j] && NOW.vis[h][k] && (i!=h || j!=k) &&NOW.Map[i][j]!=0)
                            {NEXT = NOW;
                                NEXT.fen += NOW.Map[i][j] * NOW.step;
                                NEXT.Map[i][j] = 0;
                                NEXT.Map[h][k] = 0;
                                NEXT.vis[i-1][j] = true;
                                NEXT.vis[i][j-1] = true;
                                NEXT.vis[i+1][j] = true;
                                NEXT.vis[i][j+1] = true;
                                NEXT.step += 1;
                                q.push(NEXT);
                            }
                        }
                    }
                }
            }
        }
    }
    return MAX;
}
int main()
{
    int answer = BFS();
    cout<<answer<<endl;
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: