(计蒜客)蓝桥杯模拟赛(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;
}
我们可以把任意两个在图的在边界上的相同的方格一起消掉,比如把两个 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;
}
相关文章推荐
- 2018蓝桥杯第五次模拟赛--连连看
- 计蒜客 蓝桥杯Javab组 模拟赛5 连连看
- 2017蓝桥杯模拟赛 Problem A: 算年龄(5分)
- 蓝桥杯模拟赛(五)礼物盒【dfs】
- 蓝桥杯模拟赛:猜算式
- 第八届蓝桥杯第三题承压计算
- 第七届蓝桥杯大赛个人赛省赛(软件类)A组第三题 方格填数
- 2017年蓝桥杯模拟赛-4阶梯三角形
- 第四届蓝桥杯B组第三题快速排序
- 第三届蓝桥杯Java高职组决赛第三题
- 2015年蓝桥杯A组C/C++第三题奇妙的数字
- 蓝桥杯模拟赛五 素数的个数
- 2018 蓝桥杯省赛 A 组模拟赛 划分整数
- 蓝桥杯模拟赛--滑动解锁
- 备战蓝桥杯(真题)第五届第三题(回文素数)
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第三题:李白打酒 (8' )
- 2017年蓝桥杯模拟赛-5补全数字
- 第八届蓝桥杯第三题承压计算
- 2016 蓝桥杯国赛 JAVA B组第三题 打靶
- 蓝桥杯校内选拔第三题