POJ-2969 the pilots brothers' refridgerator

可以高斯消元,但是我不会 :(

/*
 * POJ-2965 the pilots brothers' refrigerator
 * mike-w
 * 2011-9-4
 * creativewang@163.com
 * hint: DFS
 */
#include<stdio.h>
#include<stdlib.h>

long board;
long open=0x0000;
long min=0xffff;
long rec;
long ans;
long c[20]={
	0x0000,
	0xf888,0xf444,0xf222,0xf111,
	0x8f88,0x4f44,0x2f22,0x1f11,
	0x88f8,0x44f4,0x22f2,0x11f1,
	0x888f,0x444f,0x222f,0x111f
};

int getData(void)
{
	char ch;
	while((ch=getchar())!=EOF)
		if(ch=='-')
			board<<=1;
		else if(ch=='+')
			board|=0x1,board<<=1;
	board>>=1;
	return 0;
}

/*
 * n: 搜索深度
 * board: 状态
 * op: 已完成操作数
 */
int search(int n,long board,int op)
{
	if(op>=min)
		return 0;
	if(n>16)
	{
		if(board==open && op<min)
			min=op,ans=rec;
		return 0;
	}

	rec<<=1;
	search(n+1,board,op);
	rec>>=1;

	rec|=1;
	rec<<=1;
	search(n+1,board^c[n],op+1);
	rec>>=2;
	rec<<=1;

	return 0;
}

int output(void)
{
	printf("%ld\n",min);
	ans>>=1;
/*	printf("ans=%ld\n",ans);	*/
	int i,j,p=1<<15;
	for(i=1;i<=4;i++)
		for(j=1;j<=4;j++,p>>=1)
			if(ans&p)
				printf("%d %d\n",i,j);
			p>>=1;
	return 0;
}

int main(void)
{
#ifndef ONLINE_JUDGE
	freopen("1965.in","r",stdin);
#endif
	getData();
	search(1,board,0);
	output();
	return 0;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值