• 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");
    }
    
  • 相关阅读:
    UML建模语言
    iOS 键盘挡住UITextField
    IOS架构师之路:我对IOS架构的点点认识(大纲)
    自己动手写处理器之第四阶段(1)——第一条指令ori的实现
    【Android Studio】studio学习系列(一) 从eclipse导入project
    Android二维码开源项目zxing编译
    第九十六题(编写strcpy 函数)
    oracle子查询
    打印池
    咏南中间件和开发框架介绍文档下载
  • 原文地址:https://www.cnblogs.com/nanke/p/2217466.html
Copyright © 2020-2023  润新知