线程优化大赛6月的题目,6*6数独!

denghui0815 2008-06-07 09:11:13
数独(Sudoku)是一种逻辑谜题游戏,解答方法是将数字放到珊格里,但同行同列或者同一个子块里不能有相同的数字。通常珊格一般取 9x9。这样的话,每一行每一列以及这 9 个 3x3 的不重叠子块的每一个,都会包括整数 1-9 的一个具体实例。除了 9x9 的珊格外,也有可能会用 16x16 或者 6x6 的,还有一些变化形式并不使用方形的子块。

问题:写一个分析程序判断 6x6 的数独(Sudoku)谜题是否有唯一解。正确的解应该将数字 1-6 不重复的放到每一行每一列。同样的,不相重叠的 2x3 子块(2行,3列)必须包含这六个整数的一个唯一的实例。例如:
2 3 1 | 4 5 6
6 5 4 | 3 2 1
---------------
1 4 3 | 5 6 2
5 6 2 | 1 3 4
---------------
3 1 6 | 2 4 5
4 2 5 | 6 1 3

输入文件描述:当程序开始执行时,将输入文件的名字送入,通常是以命令行参数的形式。输入文件会包含一定数量的行,每行有 36 个非空子符。每行代表了在一个可能的 6×6 数独(Sudoku)谜题的初始状态下,全部字符的逐行排列。迷题初始状态中的空格将由星号字符代替。文件的结尾表示输入的结束。

输出:输出要标准化。应该指出每一个输入谜题是有唯一解,无解还是有多解。

一次输入 3 个谜题的输入示例:
*314*******1**356**621**3*******561*
***4****41*2*4321**6534*5*16****6***
5******5******5******5******5******5
(第一行对应了上面已解决的那个谜题在初始状态下的字符排列)

输出举例:
谜题 # 1 有唯一解
谜题 # 2 无解
谜题 # 3 有多解

...全文
600 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
denghui0815 2008-07-07
  • 打赏
  • 举报
回复
官方得测试数据出来了
测试了一下100000的数据大概180毫秒
另外 haojn你的bug没有发作 :)
haojn 2008-06-27
  • 打赏
  • 举报
回复
谢谢!

的确有问题
问题出在
if (layout.gapn==layout.wl[1].gapn){
layout.gapn=0;

return true;
}
这个是我最后加上的,没经过太多测试。实际上不成立的
因为即使目前所有的空格都只有一种填法,还是有可能会冲突
现在对于这种情况程序会错误的认为找到一个新的解
haojn 2008-06-26
  • 打赏
  • 举报
回复
感谢分享,我也贴出来
http://download.csdn.net/user/haojn/

算法差不多
不过我使用了多级队列,结果维护成本过高,得不偿失,导致效率低下。另外我也没有做对齐,也没有测试哪种数据大小最好
关联
denghui0815 2008-06-26
  • 打赏
  • 举报
回复
haojn 你的测试数据 我跟你的运行结果不同
**25**3******5**4**2**3******2**63**
这个数据 我的答案是有唯一解 你的答案是有多解

我进行了分析

**25** **25*3 **25*3 **25*3
3***** 3***** 3***** 3***2*
*5**4* = *5**4* = *5**4* = *5**4*
*2**3* *2**3* *2**3* *2**3*
*****2 *****2 *****2 *****2
**63** **63** 2*63** 2*63**

这两个测试数据等价
**25*33***2**5**4**2**3******22*63**
**25**3******5**4**2**3******2**63**

但是你会输出不同的结果

denghui0815 2008-06-25
  • 打赏
  • 举报
回复
我是在Win平台下测试的
CPU: Intel(R) Core(TM)2 Duo CPU T5270 @ 1.40GHz
L2 cache : 2 MB, 8-Way, 64 byte lines
Bus speed : 667 MHz

2个线程 240ms

linux下没有多核机器测试 :(

http://download.csdn.net/user/huanyun/

欢迎到这里下载源码!
jfguo 2008-06-24
  • 打赏
  • 举报
回复
光看频率没用的,还得看CPU的架构。

在另外一台PD925上跑了一下,
用gcc编译,
1线程: 920ms
2线程: 520

用icc编译,
1线程: 830ms
2线程: 460ms

用icc编译比gcc大概快10%左右。
haojn 2008-06-24
  • 打赏
  • 举报
回复
比我快很多

Q6600是2.4G,Xeon5110是1.6G
jfguo 2008-06-24
  • 打赏
  • 举报
回复
我的加速比还行,但单线程版本比较慢。
1: 940ms
2: 480ms
4: 270ms
haojn 2008-06-24
  • 打赏
  • 举报
回复
我的并行加速比很低

单线程:0.7s
2线程:0.387s
4线程:0.230s

AR=0.7/0.230=3.04

在Q6600上测的,中文输出到文件

主要问题还是单线程版本就很慢,数据结构太复杂了
jfguo 2008-06-24
  • 打赏
  • 举报
回复
我在4核(Xeon5110*2)上大概是270ms,输出用英文。
这个时间是使用gcc编译的,晚上再用Intel的编译器看看能到多少。
haojn 2008-06-23
  • 打赏
  • 举报
回复
我只能在4核上做到300ms,输出用中文了
jfguo 2008-06-23
  • 打赏
  • 举报
回复
我觉得重定向到文件的可能性比较大
haojn 2008-06-19
  • 打赏
  • 举报
回复
对了,咱们的输出是用中文么?输出到标准输出?
denghui0815 2008-06-19
  • 打赏
  • 举报
回复
测试应该是java来调用吧 不会输出到文件和屏幕吧
haojn 2008-06-19
  • 打赏
  • 举报
回复
中文用的字符少,万一测试不用“重定向”有速度优势:)
haojn 2008-06-19
  • 打赏
  • 举报
回复
[user17 ~]$ tail -n 24 /proc/cpuinfo
processor : 7
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Genuine Intel(R) CPU @ 2.66GHz
stepping : 5
cpu MHz : 2666.723
cache size : 4096 KB
physical id : 1
siblings : 4
core id : 7
cpu cores : 4
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall lm pni monitor ds_cpl est tm2 cx16 xtpr
bogomips : 5332.64
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

貌似一开始就是8个核,我自己看错了,光看见cpu cores : 4 ,没注意有个tail -n 24

有点好奇,model name为什么是Genuine Intel(R) CPU @ 2.66GHz?好像只有移动版的core才有可能写这个
denghui0815 2008-06-19
  • 打赏
  • 举报
回复
感觉不一定要用中文吧!
给个编译选项 ^_^
jfguo 2008-06-19
  • 打赏
  • 举报
回复
输出应该是到标准输出。
但是是否一定要用中文就不太清楚了。

haojn 2008-06-18
  • 打赏
  • 举报
回复
英文网站上的:
ctor:
Hello,
how many cores will be on tested computer?

mgarlanger:
In the past it's has been 8 ( 2 - Quad cores). Complete specs were listed in a message on one of the early contests.

我原来一直是按4个核心作的优化,有些甚至只启动了4个线程...
denghui0815 2008-06-18
  • 打赏
  • 举报
回复
yulinbin 你是否计算了输出的时间?

用mySolution.exe test100K.txt > out.out
进行测试 否则 输出的时间很长
加载更多回复(16)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧