| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 589 人关注过本帖
标题:Poj1166
只看楼主 加入收藏
古景涛
Rank: 2
等 级:论坛游民
帖 子:15
专家分:12
注 册:2012-11-3
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
Poj1166
POJ1166的题目链接:
http://
在下是一个新手,正在学习搜索,这是
一道深搜“水”题(对我来说不是)。
理解题意但是不知道怎么入手(枚举除外),在看一个博客的结题报告,其中有些地方不明白,在此请教各位
其代码如下:

#include<stdio.h>
#include<string.h>
int  move[9][9]={         //记录口令对每个钟表时刻的影响                                                                       
    {1,1,0,1,1,0,0,0,0},
    {1,1,1,0,0,0,0,0,0},
    {0,1,1,0,1,1,0,0,0},
    {1,0,0,1,0,0,1,0,0},
    {0,1,0,1,1,1,0,1,0},
    {0,0,1,0,0,1,0,0,1},
    {0,0,0,1,1,0,1,1,0},
    {0,0,0,0,0,0,1,1,1},
    {0,0,0,0,1,1,0,1,1}
};

int num[9],tmp[9],In_dial[9];//num[i]保存指令i的作用次数
int finished;

int judge()  //判断是否将所有的时刻拨到了12点
{
   int i,j;
   for(i=0;i<9;i++)
       tmp[i]=In_dial[i];
   for(i=0;i<9;i++)
       for(j=0;j<9;j++)
           tmp[i]=(tmp[i]+move[j][i]*num[j])%4;
    for(i=0;i<9;i++)
        if(tmp[i])
            return 0;
    return 1;
}
void output()  //输出拨动的最短序列
{
     int i,j;
     for(i=0;i<9;i++)
         for(j=0;j<num[i];j++)
             printf("%d ",i+1);
         printf("\n");
}
void dfs(int opration)
{
    int i;
    if(judge())
    {
        finished=1;
        output();
        return;
    }
    if(opration>=9)
        return ;
    for(i=0;i<4;i++)
    {
        num[opration]=i;
        dfs(opration+1);
        if(finished)
            return ;
    }
}

void main()
{
    int i;
    for(i=0;i<9;i++)
        scanf("%d",&In_dial[i]);
    memset(num,0,sizeof(num));
    finished=0;
    dfs(0);
    return ;
}
                  




for(i=0;i<4;i++)
    {
        num[opration]=i;
        dfs(opration+1);
        if(finished)
            return ;
    }

这里不解为什么要在一个循环进行深搜,已经纠结了快一个星期了,望各位指教,菜鸟感激不尽
搜索更多相关主题的帖子: include 影响 
2013-04-16 21:33
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这题用深搜和用广搜没什么区别。

每种变换方式最多只需要执行3次,再多就是多余的。加上不执行也算一种执行方式,那么每种变换方式有4种不同的执行方式。

有9种变换方式,所以总的执行方式共4的9次方种。

由于每种变换方式都是正则的,换句话说就是不能由其它变换方式叠加而成,所以在变换次数不超过3次的状态图中不存在环,即它是一棵树。这是它可以应用深搜的理论依据。否则这类问题只能应用广搜,即图的最短路径算法。

而事实上,不管是深搜还是广搜,对于这个问题都属于穷举法,算不上是什么好算法。如果你的线性代数学的还行的话会发现,这个问题只需要解一个9阶的线性方程组即可。很久以前我在这里关于点灯游戏的方程解法做过论述。这个问题与点灯游戏没有本质的区别。

重剑无锋,大巧不工
2013-04-17 00:07
古景涛
Rank: 2
等 级:论坛游民
帖 子:15
专家分:12
注 册:2012-11-3
收藏
得分:0 
谢谢版主,深搜广搜都是属于图的遍历,我也认同是穷举。我现在大一,还没有学线性代数。本来想提前自学这些基础,然后直接进入开发。但是觉得不深入学一下算法就不能算是一个程序员了,所以决定先学习一些算法。谢谢版主,望以后多多指教。


请问我要怎么样才能给分你啊?
2013-04-17 17:00
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
呵呵,点贴子右上方的结贴,然后按你的想法分配即可。
分给不给我倒没什么,我更想看到有人能用方程解决这个问题。

重剑无锋,大巧不工
2013-04-17 17:54
古景涛
Rank: 2
等 级:论坛游民
帖 子:15
专家分:12
注 册:2012-11-3
收藏
得分:0 
回复 4楼 beyondyf
等我会用的时候我写给你看
2013-04-17 21:07
快速回复:Poj1166
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036804 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved