哈理工院赛练习题 小瑞-开心消消乐 II,练习题ii
分享于 点击 32511 次 点评:43
哈理工院赛练习题 小瑞-开心消消乐 II,练习题ii
Problem F: 小瑞-开心消消乐 II
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 15 Solved: 4
[Submit][Status][Web Board] [Edit] [TestData]
Description
小瑞的女神最近迷上了开心消消乐的游戏,为了取得女神的好感,小瑞决定也开始玩下《开心消消乐》。
《开心消消乐》是一款策略型的三消游戏,玩家需要开动脑筋多次尝试,精心设计每一步;有时也需要一点小小的运气,才能在多种关卡模式中完成不同目标。游戏画面清新亮丽,音乐动听;关卡丰富,挑战多多,不断冲击新乐趣!
游戏操作是交换相邻的两个,当横向或者竖向形成三个或者三个以上时,就会消除掉。
我们定义在游戏中有六种图案,分别用字母表示,其中红色R,黄色Y,蓝色B,绿色G,紫色P,棕色W,空白没有的地方用S代替。
例如上面的图片是在7*6的形状中,字母表示为:
SPBSYS
RRPRYG
YGPPBG
YYBGRP
SRBGPS
SSGBPS
SSSRSS
游戏当交换两个之后能形成一个5个连在一起的会形成一个鹰头,会帮助消灭同一颜色的,也可以和别的特殊的一起组合,会有更强的消灭威力。
例如下面的图片当中,交换红色圈起来的那两个,能形成5连,交换绿色圈起来的那两个,也能形成5连,所以在此形状中,有2种交换方案,使游戏第一步就形成了5连。
那么问题来了,给你一个n*m的游戏(5<=n,m<=10),问有多少种交换方案,使游戏第一步就形成了5连。
Input
第一行是一个正整数T,代表有T组测试数据。每组测试数据第一行为两个整数n和m(5<=n,m<=10),接下来n行中,每行m个只包含RYBGPWS的字符,数据保证初始游戏中,不包含3个连在一起的。
Output
输出为一行,输出方案数。
Sample Input
1 7 9 SRBBRRBSS PRPRWPBWS BYRYYWRPB RRPRRWYBB BRBYPYPPY SPWRBWYYB SSYRPYYRS
Sample Output
2
HINT
空格是不能被移动的!!!
YYSYY
BBYBB
结果是0,S和Y不能交换,因为空格不能移动。
枚举任意一点,能横着就横着枚举,能竖着就竖着枚举。注意交换后可能形成两个五连,那么在枚举的时候可能重复添加方案。
/*=============================================================================
#
# Author: liangshu - cbam
#
# QQ : 756029571
#
# School : 哈尔滨理工大学
#
# Last modified: 2015-11-08 21:03
#
# Filename: A.cpp
#
# Description:
# The people who are crazy enough to think they can change the world, are the ones who do !
=============================================================================*/
#
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--){
int n, m;
cin>>n>>m;
char cnt[13][23];
memset(cnt, '\0', sizeof(cnt));
for(int i = 1; i <= n; i++){
for(int j = 1;j <= m; j++){
cin>>cnt[i][j];
if(cnt[i][j] == 'S'){
cnt[i][j] = '\0';
}
}
}
int res = 0;
for(int i = 1; i <= n; i++){
for(int j = 1;j <= m; j++){
if(cnt[i][j] == '\0'){
continue;
}
int loc, num = 1;
if(j <= m - 4){
for(int k = j + 1; k < 5 + j; k++){
if(cnt[i][k] == '\0'){
break;
}
else if(cnt[i][k] == cnt[i][j]){
num ++;
}
else{
loc = k;
}
}
if(num == 4){
if(cnt[i + 1][loc] == cnt[i][j] ){
res++;
}
if(cnt[i - 1][loc] == cnt[i][j]){
res++;
if(cnt[i - 1][loc -2] == cnt[i][loc] && cnt[i - 1][loc -1] == cnt[i][loc] && cnt[i - 1][loc + 1] == cnt[i][loc] && cnt[i - 1][loc + 2] == cnt[i][loc]){
res--;
}
}
}
}
num = 1;
if(i <= n - 4){
for(int t = i + 1; t < 5 + i; t++){
if(cnt[t][j] == '\0'){
break;
}
else if(cnt[t][j] == cnt[i][j]){
num++;
}
else{
loc = t;
}
}
if(num == 4){
if(cnt[loc][j + 1] == cnt[i][j] ){
res++;
}
if(cnt[loc][j - 1] == cnt[i][j]){
res++;
}
}
}
}
}
cout<<res<<endl;
}
return 0;
}
相关文章
- 暂无相关文章
用户点评