poj dfs相关之1753 Flip Game
132K 313MS
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n, k, ans;
bool IsFind, arr[6][6];
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
bool check()
{
int i, j, t;
t = arr[1][1];
for (i = 1; i <= 4;i++)
for (j = 1; j <= 4; j++)
{
if (t != arr[i][j])
return false;
}
return true;
}
void flip(int row, int col)
{
int i, x, y;
arr[row][col] = !arr[row][col];
for (i = 0; i < 4; i++)
{
x = row + dir[i][0];
y = col + dir[i][1];
arr[x][y] = !arr[x][y];
}
}
void dfs(int row,int col,int dep)
{
if (dep == ans)
{
if (check())
IsFind = true;
return;
}
if (row>4 || col > 4 || IsFind)
return;
flip(row, col);
if (col < 4)
dfs(row, col + 1, dep + 1);
else
dfs(row + 1, 1, dep + 1);
flip(row, col);
if (col < 4)
dfs(row, col + 1, dep);
else
dfs(row + 1, 1, dep);
}
int main()
{
//freopen("1.txt", "r", stdin);
int i, j, tmp1, tmp2;
memset(arr, 0, sizeof(arr));
char tmp[15];
for (i = 1; i < 5; i++)
{
scanf("%s", tmp);
for (j = 1; j < 5; j++)
{
if (tmp[j - 1] == 'b')
arr[i][j] = 1;
else if (tmp[j - 1] == 'w')
arr[i][j] = 0;
}
}
for (i = 0; i <= 16; i++)
{
IsFind = false;
ans = i;
dfs(1, 1, 0);
if (IsFind)
break;
}
if(IsFind)
printf("%d\n", ans);
else
printf("Impossible\n");
}
132K 125MS
这个是一个一次性枚举所有的版本,效率更高
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n, k, ans;
bool IsFind, arr[6][6];
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
bool check()
{
int i, j, t;
t = arr[1][1];
for (i = 1; i <= 4;i++)
for (j = 1; j <= 4; j++)
{
if (t != arr[i][j])
return false;
}
return true;
}
void flip(int row, int col)
{
int i, x, y;
arr[row][col] = !arr[row][col];
for (i = 0; i < 4; i++)
{
x = row + dir[i][0];
y = col + dir[i][1];
arr[x][y] = !arr[x][y];
}
}
void dfs(int row,int col,int dep)
{
if (check())
{
ans = min(ans, dep);
return;
}
if (row>4 || col > 4 || IsFind)
return;
flip(row, col);
if (col < 4)
dfs(row, col + 1, dep + 1);
else
dfs(row + 1, 1, dep + 1);
flip(row, col);
if (col < 4)
dfs(row, col + 1, dep);
else
dfs(row + 1, 1, dep);
}
int main()
{
freopen("1.txt", "r", stdin);
int i, j, tmp1, tmp2;
memset(arr, 0, sizeof(arr));
char tmp[15];
for (i = 1; i < 5; i++)
{
scanf("%s", tmp);
for (j = 1; j < 5; j++)
{
if (tmp[j - 1] == 'b')
arr[i][j] = 1;
else if (tmp[j - 1] == 'w')
arr[i][j] = 0;
}
}
ans = 17;
dfs(1, 1, 0);
if(ans<17)
printf("%d\n", ans);
else
printf("Impossible\n");
}