心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
与POJ 1753类似,但是需要加点优化,这里主要使用了位运算的方法。
#include<cstdio>
#include
<cstring>
#define g(x,y) (((x-1)<<2)+y)
using namespace std;

int a,d;
int ansn,ans;

void f(int i,int &x,int &y)
{
    x
=i/4+1;
    y
=i%4;
    
if(i%4==0)
    {
        x
--;
        y
=4;
    }
}

void handle(int &r,int x,int y)
{
    
for(int i=1;i<=4;i++)
    {
        r
^=(1<<g(x,i));
        r
^=(1<<g(i,y));
    }
    r
^=(1<<g(x,y));
}

void dfs(int last,int have)
{
    
if(have>=ansn)
        
return;

    
int r(a);
    
for(int i=1;i<=16;i++)
        
if(d&(1<<i))
        {
            
int x,y;
            f(i,x,y);
            handle(r,x,y);
        }
    
if(r==0)
    {
        ansn
=have;
        ans
=d;
    }

    
for(int i=last+1;i<=16;i++)
    {
        d
=(d|(1<<i));
        dfs(i,have
+1);
        d
=(~((~d)|(1<<i)));
    }
}

int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/

    a
=0;
    
for(int i=1;i<=4;i++)
    {
        
for(int j=1;j<=4;j++)
        {
            
char t;
            scanf(
"%c",&t);
            
if(t=='+')
                a
=(a|(1<<g(i,j)));
            
else
                a
=(~((~a)|(1<<g(i,j))));
        }
        getchar();
    }

    ansn
=0x7f7f7f7f;
    d
=0;
    dfs(
0,0);

    printf(
"%d\n",ansn);
    
for(int i=1;i<=16;i++)
        
if(ans&(1<<i))
        {
            
int x,y;
            f(i,x,y);
            printf(
"%d %d\n",x,y);
        }

    
return 0;
}
posted on 2011-07-31 09:39 lee1r 阅读(145) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:搜索

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理