易码技术论坛

 找回密码
 加入易码
搜索
查看: 586028|回复: 15

[源码] Lavo语言源程序——数独

[复制链接]
发表于 2006-6-23 13:35:00 | 显示全部楼层
代码一帖出就走样,干脆上传源代码文件。



 楼主| 发表于 2006-6-23 13:55:00 | 显示全部楼层
其中sudu_jie()函数是解数独的主函数。

采用暴力搜索算法。既没用递归,也没用堆栈。在PocketPC上运行,解一个全空的数独,耗时不到1秒。
发表于 2006-6-23 17:16:00 | 显示全部楼层
嗯,不错,支持一下。

不过如果想再LAVAXIDE上面编译运行,要做一些修改:

第29,36行的GetBlock(0,2,8,12,0x40,g_digit[0]);改为GetBlock(0,2,8,12,0,g_digit[0]);

还有那些Line(PAN_X,PAN_Y+(i<<4),PAN_X+144,PAN_Y+(i<<4),1);里面的type 应改为0x41

然后前面加上

#width  240
#height 160

这样就可以显示出来了。
发表于 2006-6-23 18:03:00 | 显示全部楼层
顶一下
 楼主| 发表于 2006-6-23 18:20:00 | 显示全部楼层
Eastsun说得对。

Lavo的绘图函数全部针对缓冲区,包括line,circle等函数,这样做是为了完全杜绝直接屏幕绘图引起的闪烁问题。
发表于 2006-6-23 18:40:00 | 显示全部楼层
未定义的变量!?


 楼主| 发表于 2006-6-23 18:48:00 | 显示全部楼层
看清楚,是Lavo语言源程序,不是LavaX!

一楼帖出来的代码走样了,从二楼下载文件。
发表于 2006-6-25 20:55:00 | 显示全部楼层
SORRY

支持LAV0,建议加上虚拟机啊!


 楼主| 发表于 2006-6-25 21:15:00 | 显示全部楼层
LavoIde里面含Lavo虚拟机啊
发表于 2006-6-25 21:17:00 | 显示全部楼层
LAVO IDE可以去lee的blog下载。。。

ps:今天下午在中关村附近的一家成都小吃看到一个人,巨象lee(的照片)
[em01]
 楼主| 发表于 2006-6-25 22:19:00 | 显示全部楼层
那一定不是俺。

俺今天一直在家安空调。
发表于 2006-6-26 00:57:00 | 显示全部楼层
支持一下,頂了[em01]
发表于 2006-6-26 01:01:00 | 显示全部楼层
11樓有意思,呵呵
[em01]
发表于 2006-6-26 01:04:00 | 显示全部楼层
LAVO面向中高端嵌入式設備,看來大有發展前景。。。

期待出GBA上的虛擬機。

正想入手NDS,看來有得玩了,嘻嘻。。。


[em01]
发表于 2006-6-30 17:44:00 | 显示全部楼层
挺好挺好。。。
 楼主| 发表于 2006-6-23 13:21:33 | 显示全部楼层 |阅读模式
  1. #define PAN_X  8
  2. #define PAN_Y  8
  3. #define PAN_COLOR 175+16
  4. #define BLOCK_COLOR 0x10
  5. #define ACT_COLOR 0x10
  6. #define DING_COLOR 0x14
  7. char g_digit[2][10][8*16];
  8. char pan[11][16];
  9. char pan_flag[11][16];
  10. char x_pan[11][16];
  11. char y_pan[11][16];
  12. char z_pan[11][16];
  13. void init_digit()
  14. {
  15. int i;
  16. char s[2];
  17. SetBgColor(PAN_COLOR);
  18. SetFgColor(ACT_COLOR);
  19. s[1]=0;
  20. for (i=0;i<10;i++) {
  21.   if (i==0) s[0]=&#39; &#39;;
  22.   else s[0]=i+&#39;0&#39;;
  23.   TextOut(0,0,s,0x81);
  24.   GetBlock(0,2,8,12,0x40,g_digit[0][i]);
  25. }
  26. SetFgColor(DING_COLOR);
  27. for (i=0;i<10;i++) {
  28.   if (i==0) s[0]=&#39; &#39;;
  29.   else s[0]=i+&#39;0&#39;;
  30.   TextOut(0,0,s,0x81);
  31.   GetBlock(0,2,8,12,0x40,g_digit[1][i]);
  32. }
  33. }
  34. void draw_pan()
  35. {
  36. int i;
  37. SetBgColor(PAN_COLOR);
  38. SetFgColor(BLOCK_COLOR);
  39. Block(PAN_X,PAN_Y,PAN_X+143,PAN_Y+143,0);
  40. for (i=0;i<10;i++) {
  41.   Line(PAN_X,PAN_Y+(i<<4),PAN_X+144,PAN_Y+(i<<4),1);
  42.   Line(PAN_X+(i<<4),PAN_Y,PAN_X+(i<<4),PAN_Y+144,1);
  43. }
  44. for (i=0;i<=144;i=i+48) {
  45.   Line(PAN_X,PAN_Y-1+i,PAN_X+144,PAN_Y-1+i,1);
  46.   Line(PAN_X,PAN_Y+1+i,PAN_X+144,PAN_Y+1+i,1);
  47.   Line(PAN_X-1+i,PAN_Y,PAN_X-1+i,PAN_Y+144,1);
  48.   Line(PAN_X+1+i,PAN_Y,PAN_X+1+i,PAN_Y+144,1);
  49. }
  50. }
  51. void draw_num()
  52. {
  53. int i,j;
  54. for (i=1;i<=9;i++) {
  55.   for (j=1;j<=9;j++) {
  56.   WriteBlock(PAN_X-16+5+(j<<4),PAN_Y-16+3+(i<<4),8,12,1,g_digit[pan_flag[i][j]][pan[i][j]]);
  57.   }
  58. }
  59. }
  60. void pan_init()
  61. {
  62. memset(pan,0,sizeof(pan));
  63. memset(pan_flag,0,sizeof(pan_flag));
  64. }
  65. void set_xyz()
  66. {
  67. int x,y,z,t;
  68. memset(x_pan,0,sizeof(x_pan));
  69. memset(y_pan,0,sizeof(y_pan));
  70. memset(z_pan,0,sizeof(z_pan));
  71. for (y=1;y<=9;y++) {
  72.   for (x=1;x<=9;x++) {
  73.   t=pan[y][x];
  74.   if (t) {
  75.    z=(x-1)/3+(y-1)/3*3+1;
  76.    x_pan[y][t]=1;
  77.    y_pan[x][t]=1;
  78.    z_pan[z][t]=1;
  79.   }
  80.   }
  81. }
  82. }
  83. void sudu_jie()
  84. {
  85. int x,y,z,t,t_bak;
  86. x=1;
  87. y=1;
  88. for (;;) {
  89.   if (pan_flag[y][x]) { //数字已固定
  90.   x++;
  91.   if (x>9) {
  92.    x=1;
  93.    y++;
  94.    if (y>9) break;
  95.   }
  96.   continue;
  97.   }
  98.   z=(x-1)/3+(y-1)/3*3+1;
  99.   t_bak=pan[y][x];
  100.   t=t_bak+1;
  101. xxx2:
  102.   pan[y][x]=t;
  103.   if (t>9) {
  104.   pan[y][x]=0;
  105.   if (t_bak) {
  106.    x_pan[y][t_bak]=0;
  107.    y_pan[x][t_bak]=0;
  108.    z_pan[z][t_bak]=0;
  109.   }
  110. xxx:
  111.   x--;
  112.   if (x<1) {
  113.    x=9;
  114.    y--;
  115.    if (y<1) break;
  116.   }
  117.   if (pan_flag[y][x]) goto xxx;
  118.   continue;
  119.   }
  120.   if (x_pan[y][t]) {
  121.   t++;
  122.   goto xxx2;
  123.   }
  124.   if (y_pan[x][t]) {
  125.   t++;
  126.   goto xxx2;
  127.   }
  128.   if (z_pan[z][t]) {
  129.   t++;
  130.   goto xxx2;
  131.   }
  132.   if (t_bak) {
  133.   x_pan[y][t_bak]=0;
  134.   y_pan[x][t_bak]=0;
  135.   z_pan[z][t_bak]=0;
  136.   }
  137.   x_pan[y][t]=1;
  138.   y_pan[x][t]=1;
  139.   z_pan[z][t]=1;
  140.   x++;
  141.   if (x>9) {
  142.   x=1;
  143.   y++;
  144.   if (y>9) break;
  145.   }
  146. }
  147. }
  148. void main()
  149. {
  150. long t;
  151. init_digit();
  152. pan_init();
  153. set_xyz();
  154. sudu_jie();
  155. SetBgColor(0xec);
  156. ClearScreen();
  157. draw_pan();
  158. draw_num();
  159. Refresh();
  160. getchar();
  161. }
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-8-24 06:19 , Processed in 0.014780 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表