我是靠谱客的博主 舒心刺猬,最近开发中收集的这篇文章主要介绍灯泡游戏,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

灯泡游戏

时间限制: 1 Sec  内存限制: 64 MB
提交: 22  解决: 9
[提交][状态][讨论版]

题目描述

有 一个n行m列的矩阵,左上角坐标是(0,0),右下角坐标是(n-1,m-1)。每个格子有一个字符, “0”至“9”表示数字0至9,“a”至“z”表示数字10至35,“A”至“Z”表示数字36至61。矩阵的每个格子都有一个灯泡,刚开始除了左上角的 灯泡是亮的,其他的灯泡都是灭的,刚开始你的得分是0。
游戏的过程是这样的:每次选一个灯泡是亮的格子X,同时选一个灯泡是灭的格子Y,而且要求 格子X和格子Y是相邻的格子。这个步骤会使你的得分增加,增加的值是:格子X与格子Y代表的数字的差的绝对值。当然,这个步骤会使你选中的灭的灯泡变亮。 重复上述操作,直到所有的灯泡都变成亮的。问你的最大得分是多少?

输入

第1行:两个整数n和m(1≤n,m≤50)。
  接下来是n行m列的矩阵。
  

输出

  一个整数,表示最大得分。
  

样例输入

2
2
05
aB

样例输出

69

提示

第一次选择:格子(0,0)和格子(1,0),得分是10-0=10;第二次选择:格子(1,0)和格子(1,1),得分是37-10:27;第三次选择:格子(1,1)和格子(0,1),得分是37-5=32,因此总得分是:10+27+32=69。

 

 

这次题主要是构建图。  又学到一招,二维数组构建新图, 用hash 值建图。

#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#define fi first
#define se second
#define pi pair<int,int>
#define md make_pair
#define ha pair<int,pair<int,pi> >
using namespace std;
const int inf=0x3f3f3f3f;
char s[55][55];
int f[3000];
int cnt=0,sum,vis[3000][3000],dx[4]={1,0,-1,0},dy[4]={0,-1,0,1};
struct node {
int x,y,w;
} nd[5000];
int change(char ch){
if(ch>='0'&&ch<='9')
return ch-'0';
else if(ch>='a'&&ch<='z')
return ch - 'a' +10;
else return ch- 'A'+36;
}
void build(int n,int m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int nx,ny;
for(int z=0;z<4;z++){
nx=i+dx[z],ny=j+dy[z];
if(nx>=0&&nx<n&&ny>=0&&ny<m){
int x=i*55+j,y=nx*55+ny;
if(!vis[x][y]){
//printf("%d %d %d n",cnt,x,y);
nd[cnt].x=x,nd[cnt].y=y;
nd[cnt].w=abs(change(s[i][j])-change(s[nx][ny]));
vis[x][y]=1;vis[y][x]=1,cnt++;
}
}
}
}
}
}
bool cmp( node a,node b){
return a.w>b.w;
}
int find(int x){
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
void kruscal(int n,int m){
for(int i=0;i<3000;i++){
f[i]=i;
}
int c=0,num=0;
while(c<cnt){
int x=find(nd[c].x),y=find(nd[c].y);
if(x!=y){
f[x]=y;
sum+=nd[c].w;
num++;
}
if(num>=n*m-1) break;
c++;
}
printf("%dn",sum);
}
int main()
{
//freopen("data.in","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%s",s[i]);
build(n,m);
//for(int i=0;i<cnt;i++)printf("%d ",nd[i].w);printf("n");
sort(nd,nd+cnt,cmp);
//for(int i=0;i<cnt;i++)printf("%d ",nd[i].w);printf("n");

kruscal(n,m);
return 0;
}

 

转载于:https://www.cnblogs.com/acmtime/p/5730990.html

最后

以上就是舒心刺猬为你收集整理的灯泡游戏的全部内容,希望文章能够帮你解决灯泡游戏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部