pku 2965 The Pilots Brothers' refrigerator 第一周训练之枚举

http://poj.org/problem?id=2965

和pku1753 一样的思路,可是自己敲了三四遍还是不出结果。就叫比较细心的GTL来帮忙看了看。。结果最重要的地方终于检查了出来,就是再change函数里面对要改变的那一点改变了两次。唉,,这错误找出来不容易啊。。。

思路:将每个点压缩进一维数组,然后每个点枚举他的两种状态(改变或者不改变),最后得出结果。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 10
#define inf 99999999
using namespace std;
int a[maxn*maxn];
char str[maxn][maxn];
struct node
{
int x,y;
}tmp[maxn*maxn],res[maxn*maxn];
int ans,k,len;
void change(int num)
{
int sh,yu,i,b;
sh = num/4;
yu = num%4;
for (b = sh*4 ,i = 0; i < 4; ++i)
{
//printf("%d ",b);
if (b != num)//就是这里才开始没有察觉到,最后使了个简单的数据才发现的错误,
//不容易啊。。。
a[b] ^= 1;
b++;
}
//printf("\n");
for (b = yu,i = 0; i < 4; ++i)
{
//printf("%d ",b);
a[b] ^= 1;
b += 4;
}
//printf("\n");
}
bool isok()
{
for (int i = 0; i < k; ++i)
{
if (a[i] != 1)
return false;
}
return true;
}
void dfs(int temp,int num)
{
int i,j;
if (temp == 1)//改变
{
change(num);
tmp[len].x = num/4;
tmp[len].y = num%4;
len ++;

}
if (isok())//是否达到要求
{
if (ans > len)
{
ans = len;
for (j = 0; j < len; ++j)
{
res[j] = tmp[j];
}
}
return ;
}
if (num >= 15) return ;
for (i = 0; i < 2; ++i)
{
dfs(i,num + 1);
if (i == 1)
{
change(num + 1);
len --;
}
}
}
int main()
{
int i,j;
ans = inf;
k = len = 0;
for (i = 0;i < 4; ++i)
{
scanf("%s",str[i]);
for (j = 0; j < 4; ++j)//压缩紧一维数组
{
if (str[i][j] == '+')
a[k++] = 0;
else
a[k++] = 1;
}
}
for (i = 0; i < 2; ++i)//遍历
{
dfs(i,0);
}
printf("%d\n",ans);
for (i = 0; i < ans; ++i)
{
printf("%d %d\n",res[i].x + 1,res[i].y + 1);
}
return 0;
}



posted @ 2012-02-23 19:29  E_star  阅读(186)  评论(0编辑  收藏  举报