题目1542:黑白迷阵

来源:互联网 发布:手机淘宝店铺模版购买 编辑:程序博客网 时间:2024/09/21 08:56
题目描述:

黑白迷阵是一个GrassLand编写的手机游戏,它的规则非常简单,有如下4*5的棋盘,其中一些是格子是黑色,一些格子是白色的,每当点击其中某一个格子,它以及它上下左右五个格子的颜色会发出反转,如下图

                     

           


游戏胜利的条件很简单,把所有的格子变为黑色即可。
GrassLand想知道,给定一个游戏格局,至少需要几次点击,就可以获得游戏的胜利。

输入:

输入包含多组测试用例。输入的第一行为一个整数T,代表共有的测试用例数。紧接着为T组测试用例。
每组测试用例,为由四行五列01阵列表示的游戏格局,其中0代表该格子的颜色为白色,1代表该格子的颜色为黑色。

输出:

对于每组测试用例,输出为一个整数,为至少需要的点击次数。数据保证所给格局可以在有限步内取得胜利。

样例输入:
20011101111111111111100111011111111011100
样例输出:
12


#include <stdio.h>#include <string.h>const int dx[5] = {-1,0,0,0,1};const int dy[5] = {0,-1,0,1,0};const int M = 4;const int N = 5;int T;int map[5][5];int flip[5][5];int get(int x, int y){int c = map[x][y];for(int d = 0; d < 5; d++){int x2 = x + dx[d];int y2 = y + dy[d];if(x2 >= 0 && x2 < M && y2 >= 0 && y2 < N){c += flip[x2][y2];}}return c % 2;}int calc(){for(int i = 1; i < M; i++){for(int j = 0; j < N; j++){if(get(i - 1,j) != 0){flip[i][j] = 1;}}}for(int j = 0; j < N; j++){if(get(M - 1, j) != 0){return -1;}}int res = 0;for(int i = 0; i < M; i++){for(int j = 0; j < N; j++){res += flip[i][j];}}return res;}int main(){while(scanf("%d", &T) != EOF){while(T--){char temp[10];for(int i = 0; i < M; i++){scanf("%s", &temp);for(int j = 0; j < N; j++){if(temp[j] == '0'){map[i][j] = 1;}else if(temp[j] == '1'){map[i][j] = 0;}}}int res = -1;for(int i = 0; i < 1 << N; i++){memset(flip, 0, sizeof(flip));for(int j = 0; j < N; j++){flip[0][N - 1 - j] = i >> j & 1;}int num = calc();if(num >= 0 && (res < 0 || res > num)){res = num;}}printf("%d\n", res);}}return 0;}



0 0
原创粉丝点击