喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 帮助

RSS 订阅当前论坛  

喜悦证交所已经关闭

上一主题 下一主题
 13  1/2  1  2  > 
     
标题: 有没有人研究过数独游戏的出题算法?  
 
竖起中指
注册会员
Rank: 2



UID 76068
精华 0
积分 55
帖子 64
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-7-7
状态 离线
有没有人研究过数独游戏的出题算法?

希望高手们能讨论讨论!
2006-7-11 09:52 AM#1
查看资料  发短消息  顶部
 
唠叨 (唠叨)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 9955
精华 0
积分 1479
帖子 1546
金钱 1479 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2001-10-27
状态 离线
[推荐阅读] 已经安装了 Apache 和 PHP,怎样安装 SSL 和 curl
还是很简单的
2006-7-13 08:43 AM#2
查看资料  Blog  发短消息  顶部
 
esayr (esayr)
新手上路
Rank: 1
初级会员



UID 26107
精华 0
积分 37
帖子 37
金钱 37 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2004-2-12
状态 离线
[推荐阅读] 请教Session的时限问题!
只研究过解答..
2006-7-13 11:30 AM#3
查看资料  访问主页  发短消息  QQ . .   顶部
 
蓝色地平线 (蓝色地平线)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 22293
精华 3
积分 14773
帖子 8899
金钱 14743 喜悦币
威望 30
人脉 0
阅读权限 100
注册 2003-8-7
来自 首都哇!!厉害厉害!!
状态 离线
[推荐阅读] 急,我的linux怎么无法识别键盘了
回复 #2 唠叨 的帖子

给个算法参考一下 谢谢了
2006-7-13 03:43 PM#4
查看资料  Blog  发短消息  QQ . .   顶部
 
竖起中指
注册会员
Rank: 2



UID 76068
精华 0
积分 55
帖子 64
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-7-7
状态 离线
[推荐阅读] 北京国通达通信技术有限公司招募PHP程序员


QUOTE:
原帖由 唠叨 于 2006-7-13 08:43 AM 发表
还是很简单的
我觉得出题的算法还是比较有难度的,尤其是考虑为题目划分难度等级,还要从解法上入手
2006-7-13 10:32 PM#5
查看资料  发短消息  顶部
 
唠叨 (唠叨)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 9955
精华 0
积分 1479
帖子 1546
金钱 1479 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2001-10-27
状态 离线
[推荐阅读] 疑难问题!
给一个计算机自动完成的例子,共参考[

<?php
set_time_limit(0);

define('MAXNUM', 81);        //单元格数
define('SHOWWAIT', 200000);        //显示停顿时间,单位微秒

/**
* 统计指定单元格所在行、列、块已添数字
* 如发现现违规输入则中断运行
* 参数
*  $i 数值,单元格所在行
*  $j 数值,单元格所在列
* 返回 数组,分别为单元格所在行、列、块已添数字
**/
function load($i, $j) {
        global $dw;
        $row = array();
        $col = array();
        $block = array();
        foreach($dw[$i] as $v) {
                if(! empty($v)) $row[] = $v;
        }
        if(count(array_count_values($row)) != count($row))
                message("第 $i 行输入错误");
        foreach($dw as $v) {
                if(! empty($v[$j])) $col[] = $v[$j];
        }
        if(count(array_count_values($col)) != count($col))
                message("第 $j 列输入错误");
        $di = floor($i/3)*3;
        $dj = floor($j/3)*3;
        for($i=$di; $i<$di+3;$i++) {
                for($j=$dj; $j<$dj+3;$j++) {
                        $v = $dw[$i][$j];
                        if(! empty($v)) $block[] = $v;
                }
        }
        if(count(array_count_values($block)) != count($block))
                message('第 '.($di/3).','.($dj/3).' 块输入错误');
        $ar = array($row, $col, $block);
        return $ar;
}

/**
* 记录成功排列的“九宫格”数据
* 参数 无
* 返回 无
**/
function save() {
        global $dw;
        $val = '';
        foreach($dw as $v) {
                $val .= join('', $v);
        }
        $val = str_replace(' ', '', $val);
        if(strlen($val) != MAXNUM) return;
        if(! search($val)) {
                $fp = fopen('data.txt', 'a+');
                fwrite($fp, "$val\r\n");
                fclose($fp);
        }
}

/**
* 检查传入的数据是否已被保存
* 参数
*  $val 字符串,待检查的数据
* 返回 逻辑值,在 true,不在 false
**/
function search($val) {
        if(! is_file('data.txt')) return false;
        $fp = fopen('data.txt', 'r');
        while(! feof($fp)) {
                $s = trim(fgets($fp, 100));
                if($s == $val) {
                        fclose($fp);
                        return true;
                }
        }
        fclose($fp);
        return false;
}

/**
* 暂停当前程序,等待若干时间后继续
* 参数
*  $t 数值,等待的时间,单位 微秒
* 返回 无
**/
function wait($t=0) {
        list($usec, $sec) = explode(" ",microtime());
        $t1 = (float)$usec + (float)$sec;
        do {
                list($usec, $sec) = explode(" ",microtime());
                $t2 = (float)$usec + (float)$sec;
         }while($t2 - $t1 < $t/1000000);
}

/**
* 消息发布
* 参数
*  $str 字符串,待发布的信息
* 返回 无
* 说明 执行后将终止当前程序的运行
**/
function message($str) {
        echo "<script>document.getElementById('view').innerHTML = '$str'</script>\n";
        exit;
}

/**
* 在记录文件中检索是否存在符合当前样本的记录
* 参数
*  $ar 数组,输入的样本
* 返回 逻辑值,存在 true,不存在 false
* 说明 当检索成功时全局变量中将保存有成功的案例
**/
function find($ar) {
        global $dw;
        $type = false;
        $p = '';
        foreach($ar as $v) {
                $p .= empty($v) ? '.' : $v;
        }
        if(! file_exists('data.txt')) return false;
        if(! ($fp = @fopen('data.txt', 'r'))) return false;
        while(! feof($fp)) {
                $buf = trim(fgets($fp, 100));
                if(ereg($p, $buf)) {
                        $type = true;
                        break;
                }
        }
        fclose($fp);
        if($type) {
                $dw = array_chunk(split(',', chunk_split($buf, 1, ',')),9);
        }
        return $type;
}

/**
* 填写“九宫格”函数
* 使用递归算法遍历单元格
* 参数
*  $pos 数值,指定待处理的单元格编号
* 返回 逻辑值,成功 true,失败 false
**/
function check($pos) {
        global $dw, $d;
        if($pos == MAXNUM) return true;
        while($pos < MAXNUM) {
                $i = floor($pos/9);
                $j = floor($pos%9);
                $value = $dw[$i][$j];
                list($row, $col, $block) = load($i, $j);
                if(empty($value)) {
                        shuffle($d);
                        $t = array_diff($d, $row, $col, $block);
                        foreach($t as $v) {
                                $dw[$i][$j] = $v;
                                echo "<script>document.getElementById('j$i$j').value=$v</script>\n";
                                flush();
                                wait(SHOWWAIT);
                                if(check($pos+1)) return true;
                                $dw[$i][$j] = '';
                                echo "<script>document.getElementById('j$i$j').value=''</script>\n";
                                flush();
                                wait(SHOWWAIT);
                        }
                        return false;
                }
                $pos++;
        }
        return true;
}

$start = false;
if(!empty($_POST['submit'])) {
        $_POST['dw'] = array_map('trim', $_POST['dw']);
        $inp = $_POST['dw'];
        if(!find($inp)) {
                $dw = array_chunk($_POST['dw'], 9); //按行分割提交的数据
                $start = true;
        }
}else {
        $dw = array_chunk(array_fill(0, 81, ''), 9);
}
?>
<html>
<head>
<title>九 宫 格</title>
</head>
<body>
<table align="center" width=80%>
<tr>
<td valign=top width=300>游戏规则:<br>
<ol type=1>
<li>将1到9填入此表格中</li>
<li>在9×9的格子每行每列,只能且必须填1到9这9个数字 (9个数字都必须出现)</li>
<li>在3×3的每个大格子中的9个数必须是1到9这9个数字(9个数字都必须出现)</li>
</ol>
<b>注意:当你发现在数字总是一个区间内重复时,可能预示按输入的样本将无法完成“九宫格”排列。
如不想等待,请单击“停止”(stop)终止当前的程序</b>
</td>
<td>
<h2 align="center">输入数字</h2>
<table width="225" border="2" align="center" cellpadding="1" cellspacing="0" >
<form method="POST">
<?php
$color = array(
        array('red', 'orange', 'yellow'),
        array('orange', 'yellow', 'green'),
        array('yellow', 'green', 'blue'),
);
for($i=0; $i<9; $i++) {
        echo "<tr>\n";
        for($j=0,$p='A'; $j<9; $j++,$p++) {
                $c = $color[floor($i/3)][floor($j/3)];
                $cc = empty($inp[$i*9+$j]) ? '#000000' : '#FF0088';
                $v = $dw[$i][$j];
                echo "<td width=25 bgcolor=$c bordercolor=$c>";
                echo "<input type=text name=dw[] size=1 maxlength=1 id='j$i$j' value='$v' style='color:$cc'></td>\n";
        }
        echo "</tr>\n";
}
?>
<tr>
<td align="center" colspan="9">
<input type="submit" name=submit value="提交">
<input type="submit" name=reset value="清空">
</td>
</tr>
</form>
</table>
</td></tr>
<tr><td></td><td id='view' align="center" style="color:red"></td></tr></table>
</body>
</html>
<?php
if($start) {
        $d = array(1,2,3,4,5,6,7,8,9);
        shuffle($d);
        if(check(0)) {
                save();
        }else {
                message('无法完成排列');
        }
}
?>
2006-7-14 08:35 AM#6
查看资料  Blog  发短消息  顶部
 
竖起中指
注册会员
Rank: 2



UID 76068
精华 0
积分 55
帖子 64
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-7-7
状态 离线
[推荐阅读] 3个数据库怎么能够只用一个连接
看看先!
谢了
2006-7-14 11:47 AM#7
查看资料  发短消息  顶部
 
竖起中指
注册会员
Rank: 2



UID 76068
精华 0
积分 55
帖子 64
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-7-7
状态 离线
[推荐阅读] LINUX+PHP +MYSQL 工作两年,要6000可以吗?
这只是解题而已,出题应该比较有难度
2006-7-14 12:29 PM#8
查看资料  发短消息  顶部
 
蓝色地平线 (蓝色地平线)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 22293
精华 3
积分 14773
帖子 8899
金钱 14743 喜悦币
威望 30
人脉 0
阅读权限 100
注册 2003-8-7
来自 首都哇!!厉害厉害!!
状态 离线
[推荐阅读] 请问phpinfo显示的信息没有Apache Environment这块,为什么了啊?
嗯 出题的难度关键就在,怎么根据用户选择的难易度 出相对应的题目 且保证题目有解
2006-7-14 03:24 PM#9
查看资料  Blog  发短消息  QQ . .   顶部
 
蓝色地平线 (蓝色地平线)
版主
Rank: 7Rank: 7Rank: 7
版主



UID 22293
精华 3
积分 14773
帖子 8899
金钱 14743 喜悦币
威望 30
人脉 0
阅读权限 100
注册 2003-8-7
来自 首都哇!!厉害厉害!!
状态 离线
[推荐阅读] 乡亲们~~~俺黄世仁~~~回来了~~~
我现在有一个生成好的完整的九宫图 要怎么样能把其中一些数字去掉让用户来填 并且保证解题是唯一的而且难易度可调

搞了一天头大
2006-7-14 05:21 PM#10
查看资料  Blog  发短消息  QQ . .   顶部
 13  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.026105 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP