POJ-2965-The Pilots Brothers' refrigerator-bfs枚举-位运算

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


规模比较小,每一个步骤都用位运算就好了 


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std; 
char mp[5][5];
int tm[5][5];
struct node
{
	int x,num,last;
	node(){}
	node(int a,int b,int c){x=a;num=b;last=c;}
}; 

node ans[1000000] ;
int  prin[100000][2];
int  ok_p;
int ok;
int wei[16]={
	63624,62532,61986,61713
		,36744,20292,12066,7953
		,35064,17652,8946,4593
		,34959,17487,8751,4383
};
int vis[1<<16+5];
void get_ans(int xx)
{
	if (xx==1)
		return ; 
	prin[++ok_p][0]=ans[xx].num/4;
	prin[ok_p][1]=ans[xx].num%4;
	get_ans(ans[xx].last); 
} 
node que[500100];
int que_ed,que_st ;
int main()
{
	que_st=	 que_ed=0;
	ok=0;ok_p=0;
	scanf("%s",mp[0]); 
	scanf("%s",mp[1]);
	scanf("%s",mp[2]);
	scanf("%s",mp[3]);
	int tmp=0;
	int i,j;
	for (i=3;i>=0;i--)
	{
		for (j=3;j>=0;j--)
		{
			tmp<<=1;
			if (mp[i][j]=='+')    // + 0 - 0
				tmp++;
		}
	} 
	if (!tmp)
	{
		printf("0\n");
		return 0;
	}
	que[++que_ed]=node(tmp,0,1);
	//sb.push(node(tmp,0,1)); 
	while(que_ed>que_st)
	{ 
		node rt=que[++que_st];
		//	sb.pop();  
		ans[++ok]=rt;
		int tmp=rt.x; 
		int i=0,j=0;
		int k,h,p; 
		int flag=0;
		for ( k=0;k<16;k++)
		{ 
			
			int tt=rt.x^wei[15-k]; 	
			if (vis[tt]) continue;
			vis[tt]=1;
			node ss(tt,k,ok);  
			//	sb.push(ss); 
			que[++que_ed]=ss;
			if (ss.x==0)
			{
				prin[++ok_p][0]=k/4;
				prin[ok_p][1]=k%4;
				get_ans(ok); flag=1;
				break;
			} 
		} 
		if (flag)break;
	} 
	printf("%d\n",ok_p);
	for (i=ok_p;i>=1;i--)
	{
		printf("%d %d\n",prin[i][0]+1,prin[i][1]+1);
	} 
	return 0;
	
}


你可能感兴趣的:(POJ-2965-The Pilots Brothers' refrigerator-bfs枚举-位运算)