您的位置:首页 > 其它

51Nod-1337-翻转游戏

2016-09-09 16:42 281 查看
ACM模版

描述



题解

首先逐关进行两次遍历,遍历第一遍,查找到开关操作是否需要,再遍历一遍,检索
?
,如果遇见
?
则向下一组查找对应位置,直到查找到最后一关卡,或者不是
?
的关卡,这时,根据此关卡是否进行相关开关操作来改变后边关卡的对应位置的状态,具体有三大种五小种状态,逐一分析,逐一修正即可。

代码

#include <iostream>
#include <cstring>

using namespace std;

const int MAXN = 55;

char LevS[MAXN][MAXN];

void init()
{
for (int i = 0; i < MAXN; i++)
{
LevS[0][i] = '-';
}
return ;
}

int main(int argc, const char * argv[])
{
init();

//    freopen("/Users/zyj/Desktop/input.txt", "r", stdin);

int T;
cin >> T;

while (T--)
{
int N, M;
cin >> N >> M;
int count = N;
for (int i = 1; i <= N; i++)
{
scanf("%s", LevS[i]);
}

for (int i = 1; i <= N; i++)
{
bool open = false;
bool close = false;
for (int j = 0; j < M; j++)
{
if (LevS[i - 1][j] == '-' && LevS[i][j] == '+')
{
open = true;
}
else if (LevS[i - 1][j] == '+' && LevS[i][j] == '-')
{
close = true;
}
}
if (open)
{
count++;
}
if (close)
{
count++;
}
for (int j = 0; j < M; j++)
{
int pos = i;
while (LevS[pos][j] == '?' && pos < N)
{
pos++;
}
if (pos == i)
{
continue;
}
if (LevS[pos][j] == LevS[i - 1][j] || LevS[pos][j] == '?')
{
for (int k = i; k <= pos; k++)
{
LevS[k][j] = LevS[i - 1][j];
}
}
if (LevS[pos][j] == '+' && LevS[i - 1][j] == '-' && open)
{
for (int k = i; k < pos; k++)
{
LevS[k][j] = '+';
}
}
else if (LevS[pos][j] == '+' && LevS[i - 1][j] == '-' && !open)
{
LevS[i][j] = '-';
}
if (LevS[pos][j] == '-' && LevS[i - 1][j] == '+' && close)
{
for (int k = i; k < pos; k++)
{
LevS[k][j] = '-';
}
}
else if (LevS[pos][j] == '-' && LevS[i - 1][j] == '+' && !close)
{
LevS[i][j] = '+';
}
}
}
cout << count << '\n';
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位子游戏