USACO 1.41 The clocks

哎,纠结了那么久,终于过了,本来很直接的想到了BFS,可是怎么纠结也过不了,orz……

还是用DFS了,嘿嘿,一开始好囧,没注意到,其实每一种方法最多只能走四次,走四次就回到初始状态了;

DFS的过程比较好理解,从第一种方法开始,枚举这种方法走到次数,接着第二种方法,…………,这样,知道 第九种方法,再判断是否满足条件……

/*
ID: nanke691
LANG: C++
TASK: clocks
*/
#include<iostream>
#include<algorithm>
#include<fstream>
#include<string.h>
using namespace std;
int dir[9][9]={{3,3,0,3,3,0,0,0,0},{3,3,3},{0,3,3,0,3,3},{3,0,0,3,0,0,3},{0,3,0,3,3,3,0,3},
               {0,0,3,0,0,3,0,0,3},{0,0,0,3,3,0,3,3},{0,0,0,0,0,0,3,3,3},{0,0,0,0,3,3,0,3,3}};
int ans[9];
int clock1[9];
int bestmove;
void dfs(int *move ,int k)
{
	if(k==9)
	{
		for(int i=0;i<9;i++)
			if(clock1[i]%12!=0)
				return ;
		int cnt=0;
		for(int i=0;i<9;i++)
			cnt+=move[i];
		if(bestmove==0 || cnt<bestmove)//比较,记录步数最少的
		{
			bestmove=cnt;
			for(int i=0;i<9;i++)
				ans[i]=move[i];
			return ;
		}
	}
	for(int rep=3;rep>=0;rep--)
	{
		for(int i=0;i<rep;i++)
		{
			for(int j=0;j<9;j++)
			clock1[j]+=dir[k][j];
		}
		move[k]=rep;
		dfs(move,k+1);
		for(int i=0;i<rep;i++)//还原
			for(int j=0;j<9;j++)
				clock1[j]-=dir[k][j];
	}
}
int main()
{
	int move[9];
	freopen("clocks.in","r",stdin);
	freopen("clocks.out","w",stdout);
	for(int i=0;i<9;i++)
		scanf("%d",&clock1[i]);
	bestmove=0;
	memset(ans,0,sizeof(ans));
	dfs(move,0);
	char *s="";
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<ans[i];j++)
		{
			printf("%s%d",s,i+1);
		    s=" ";
		}
	}
	printf("\n");
}
原文地址:https://www.cnblogs.com/nanke/p/2217466.html