2014华为武汉上机试题三:CandyBrush游戏
2013-09-13 19:37
302 查看
CandyBrush游戏
描述: CandyBrush一款流行的消除游戏,在一个方阵中布满各种糖果,任意交换两个糖果,如果交换后出现横向或者竖向有连续三个相同的情况,则可以消除糖果并得分。
输入25个字符组成的字符串(编号为1到25),表示5×5的方阵,每个字符表示不同类型的糖果(区分大小写),判断是否有解,即交换某两个糖果后能够消除糖果。
举例,下面的方阵无解
T M T M O
X R U C q
A B C X R
U R M T O
T Q C R A
下面的方阵交换(0, 2)和(1, 2)两个糖果后,能消除M
T M T M O
X R M C q
A B C X R
U R M T O
T Q C R A
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号(1到25),比如:上面的方阵中,被交换的糖果,编号最小的为糖果“T”,编号为3。
如果无解,则输出NO。
运行时间限制: 无限制
内存限制: 无限制
输入:
输入25个字符组成的字符串,不含空格,表示5×5的方阵
输出:
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号,以空格隔开。如果无解,则输出NO。
样例输入:
TMTMOXRMCqABCXRURMTOTQCRA
样例输出:
YES 3
答案提示:
输出最小糖果编号的意思,就是从左至右,从上到下遍历糖果,找到第一个跟其他交换后能消除的糖果即可。
以下代码来自tianmo2010的博客 /article/2798193.html
描述: CandyBrush一款流行的消除游戏,在一个方阵中布满各种糖果,任意交换两个糖果,如果交换后出现横向或者竖向有连续三个相同的情况,则可以消除糖果并得分。
输入25个字符组成的字符串(编号为1到25),表示5×5的方阵,每个字符表示不同类型的糖果(区分大小写),判断是否有解,即交换某两个糖果后能够消除糖果。
举例,下面的方阵无解
T M T M O
X R U C q
A B C X R
U R M T O
T Q C R A
下面的方阵交换(0, 2)和(1, 2)两个糖果后,能消除M
T M T M O
X R M C q
A B C X R
U R M T O
T Q C R A
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号(1到25),比如:上面的方阵中,被交换的糖果,编号最小的为糖果“T”,编号为3。
如果无解,则输出NO。
运行时间限制: 无限制
内存限制: 无限制
输入:
输入25个字符组成的字符串,不含空格,表示5×5的方阵
输出:
如果有解,则输出YES,同时输出所有交换方案中,被交换糖果最小编号,以空格隔开。如果无解,则输出NO。
样例输入:
TMTMOXRMCqABCXRURMTOTQCRA
样例输出:
YES 3
答案提示:
输出最小糖果编号的意思,就是从左至右,从上到下遍历糖果,找到第一个跟其他交换后能消除的糖果即可。
以下代码来自tianmo2010的博客 /article/2798193.html
// 代码版权归TianMo2010 所有 #include <stdio.h> #include <string.h> #define N 5 int findChar(char a , char c, char direct, char &ret, int i0, int j0) { int i ,j; //纵向查找 if (direct == '0') { //向上 i = i0 - 1; if (i >= 0 && i < N ) { if (a[i][j0] == c) { ret = '0'; return 1; } } //向下 i = i0 + 1; if (i >= 0 && i < N) { if (a[i][j0] == c) { ret = '1'; return 1; } } } else if (direct == '1') {//横向查找 //向左 j = j0 - 1; if (j >= 0 && j < N ) { if (a[i0][j] == c) { ret = '0'; return 1; } } //向右 j = j0 + 1; if (j >= 0 && j < N) { if (a[i0][j] == c) { ret = '1'; return 1; } } } else { //没有找到 } return 0; } int main() { int i,j; int row = 0, col = 0; int rowPos = 0, colPos = 0; char pA, pB, pC; char direct = '0'; //向上或向左, direct = '1',表示向下或向右 char a = {{'T','M','T','M','O'},{'X','R','M','C','q'},{'A','B','C','X','R'},{'U','R','M','T','O'},{'T','Q','C','R','A'}}; /* for (i = 0 ; i < N; ++ i) { for (j = 0; j < N; ++ j) { scanf("%c", &a[i][j]); } } */ //每行 for (i = 0; i < N; ++ i) { for (j = 0; j < N - 2; ++ j) { //记录每行连续的三个字符 pA = a[i][j]; pB = a[i][j + 1]; pC = a[i][j + 2]; //当连续的三个字符相同 if (pA == pB && pA == pC && pB == pC) { row = 1; rowPos = i * N + j + 1; break; } else if (pA == pB) { if (findChar(a, pA, '0', direct, i, j + 2) == 1) { row = 1; if (direct == '0') { rowPos = (i - 1) * N + (j + 2) + 1;; } else { rowPos = i * N + (j + 2) + 1; } break; } } else if (pA == pC) { if (findChar(a, pA, '0', direct, i, j + 1) == 1) { row = 1; if (direct == '0') { rowPos = (i - 1) * N + (j + 1) + 1;; } else { rowPos = i * N + (j + 1) + 1; } break; } } else if (pB == pC) { if (findChar(a, pB, '0', direct, i, j) == 1) { row = 1; if (direct == '0') { rowPos = (i - 1) * N + (j) + 1;; } else { rowPos = i * N + (j) + 1; } break; } } else { //行中没有找到 } } } //每列 direct = '0'; for (i = 0; i < N; ++ i) { for (j = 0; j < N - 2; ++ j) { pA = a[j][i]; pB = a[j + 1][i]; pC = a[j + 2][i]; if (pA == pB && pA == pC && pB == pC) { col = 1; colPos = j * N + i + 1; } else if (pA == pB) { if (findChar(a, pA, '1', direct, j + 2, i) == 1) { col = 1; if (direct == '0') { colPos = (j + 2) * N + (i - 1) + 1; } else { colPos = (j + 2) * N + (i + 1) + 1; } break; } } else if (pA == pC) { if (findChar(a, pA, '1', direct, j + 1, i) == 1) { col = 1; if (direct == '0') { colPos = (j + 1) * N + (i - 1) + 1; } else { colPos = (j + 1) * N + (i + 1) + 1; } break; } } else if (pB == pC) { if (findChar(a, pB, '1', direct, j , i) == 1) { col = 1; if (direct == '0') { colPos = j * N + (i - 1) + 1; } else { colPos = j * N + (i + 1) + 1; } break; } } else { //列中没有找到 col = 0; } } } int minPos = -1; if (row == 1 && col == 1) { if (rowPos > colPos) { minPos = colPos; } else { minPos = rowPos; } } else if (row == 1) { minPos = rowPos; } else if (col == 1) { minPos = colPos; } if (minPos == -1) { printf("NO \n"); } else { printf("YES, %d\n", minPos); } return 0; }
相关文章推荐
- 2014华为武汉上机试题规范
- 2014华为武汉上机试题一:手机电池余量
- 2014华为武汉上机试题一:手机电池余量
- 2014华为武汉上机试题二:姓名的夫妻相
- 2014华为上机试题
- 2014华为上机试题
- 2014华为上机试题
- 【华为2014上机试题】设计一个定时器管理系统
- 2014华为上机试题
- 华为机试题-2014校园招聘
- 2014 8月华为软件类上机笔试
- 2014腾讯实习生招聘武汉试题
- 2014华为校园招聘第三轮上机题目(南京-C/C++)
- 2014华为校园招聘上机测试题目(华科提前批)
- 华为上机试题练习
- 【华为2016上机试题C++】最高分是多少
- 华为上机试题1(删除字符串中出现次数最少的字符)
- 华为校招上机试题之字符串特殊字符过滤
- 华为2014机试试题 - 洞穴逃生
- 华为java上机试题