[USACO] The Clocks [位操作 BFS]

思路:

位操作+廣搜。

1到9個時鐘,每個時鐘狀態用兩位表示 ,共18位。即每個狀態用一個int表示即可。

然後直接廣搜,每個狀態都是一個int型,每次某狀態到達用一個hash表記錄。

一次AC。

位操作寫得很蛋疼,事後查了一下網上報告,好像沒這麼做的,就記錄一下把。


/*
ID:wuyanyi1
PROG:clocks
LANG:C++
*/

#include<iostream>
#include<fstream>
#include<map>
#include<vector>
#include<string>
#include<memory.h>
#include<algorithm>
#include<queue>
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define llong long long int
using namespace std;
const int N=10,inf=(1<<30);
const int M=(1<<18)-1;
int n;
int mp[N][N]={{},
	{4,1,2,4,5},{3,1,2,3},{4,2,3,5,6},{3,1,4,7},{5,2,4,5,6,8},
	{3,3,6,9},{4,4,5,7,8},{3,7,8,9},{4,5,6,8,9}
};
int a[N];
int vis[M+10];
int val[M+10];
int chbit(int state,int pos,int bit)
{
	if(bit)
	{
		unsigned int now=1;
		now<<=pos;
		state|=now;
	}
	else
	{
		unsigned int now=M-1;
		now=(now<<pos)|(now>>(18-pos));
		state&=now;
	}
	return state&M;
}
int oper(int state,int k)
{
	for(int i=1;i<=mp[k][0];i++)
	{
		int pos=(9-mp[k][i])*2;
		int now=(state>>pos)&1;
	//	printf("%d ",now);
		now+=((state>>(pos+1))&1)*2;
	//	printf("%d %d\n",now,pos);
		if(now==3)
		{
			state=chbit(state,pos,0);
			state=chbit(state,pos+1,0);
		}
		else
		{
			now++;
			state=chbit(state,pos,now&1);
			state=chbit(state,pos+1,(now>>1)&1);
		}
	}
	return state&M;
}
void bfs(int s)
{
	queue<int> que;
	que.push(s);
	vis[s]=-1;
	while(!que.empty())
	{
		int now=que.front();
		que.pop();
		for(int i=1;i<=9;i++)
		{
			int t=oper(now,i);
			if(!vis[t])
			{
				que.push(t);
				vis[t]=now;
				val[t]=i;
				if(!t)
				{
					return;
				}
			}
		}
	}
}
void print(int i)
{
	if(vis[i]!=-1)
	{
		print(vis[i]);
		printf("%d",val[i]);
		if(i)
		  printf(" ");
		else
		  printf("\n");
	}
/*	else
	{
		printf("",val[i]);
	}*/
}
int main()
{
	int s=0;
	freopen("clocks.in","r",stdin);
	freopen("clocks.out","w",stdout);
	for(int i=1;i<=9;i++)
	{
		scanf("%d",a+i);
		a[i]/=3;
		a[i]%=4;
//		printf("%d",a[i]);
		s<<=2;
		s|=a[i];
		
	}

	bfs(s);

	print(0);
//	printf("\n");
	return 0;
}


發佈了225 篇原創文章 · 獲贊 30 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章