//小弟新手,只能用最简单的枚举法将所有的可能列举出来,然后比较出最大值
#include<iostream>
#include<cmath>
using namespace std;
char a[4][4];
int b[16];
int main()
{
int n, i, j, k;
int count, temp;
bool f(int);
while (cin >> n&&n != 0)
{
count = -1;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin >> a[i][j];
b[i*n+j] = 0;
}
}
b[0] = -1;
for (i = 0; i < (int)pow(2.0, (double)(n*n)); i++)
{
b[0]++;
for (j = 0; j < n*n - 1; j++)
{
if (b[j] == 2)
{
b[j] = 0;
b[j + 1]++;
}
}
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
if (b[j*n + k] == 1 && a[j][k] != 'X')a[j][k] = 'O';
if (b[j*n + k] == 0 && a[j][k] != 'X')a[j][k] = '.';
}
}
if (f(n))
{
temp = 0;
for (k = 0; k < n; k++)
{
for (j = 0; j < n; j++)
{
if (a[k][j] == 'O')temp++;
}
}
if (temp>count)count = temp;
}
}
cout << count << endl;
}
return 0;
}
bool f(int n)
{
for (int i = 0; i < n; i++)
{
int flag1 = 0, flag2 = 0;
for (int j = 0; j < n; j++)
{
if (a[i][j] == 'X')flag1 = 0;
if (a[j][i] == 'X')flag2 = 0;
if (a[i][j] == 'O')flag1++;
if (a[j][i] == 'O')flag2++;
}
if (flag1>1 || flag2>1)return 0;
}
return 1;
}

本文介绍了一个使用枚举法解决特定棋盘问题的C++程序实现。该程序通过遍历所有可能的棋盘状态来找出最优解,旨在找到放置最多的'O'标记而不会出现相邻'O'的情况。文章详细展示了如何利用双重循环和条件判断来更新棋盘状态,并通过一个辅助函数检查当前布局的有效性。

780

被折叠的 条评论
为什么被折叠?



