资源

基于逻辑的谜题(clp1)

/***************************************************************//*                                                             *//*S A S S A M P L E L I B R A R Y*//*                                                             *//*名称:clp1*//*标题:基于逻辑的谜题(clp1)*//*产品:或*//*系统:所有*//*关键字:或*//*项目:CLP、IML*//*数据:*//*                                                             *//*支持:更新:*//*参考编号:*//*MISC:CLP程序章节中的示例1*//*约束编程书*//*                                                             *//***************************************************************//*给出一个数独问题*/数据indata;输入C1-C9;数据线;. . 5 . . 7 . . 1. 7 . . 9 . . 三。. . . 6 . . . . .. . 3 . . 1。5. 9 . . 8 . . 2 .1。2 . . 4 . .. . 2 . . 6 . . 9. . . . 4。8 .8 . . 1。5 . .;运行;/*打印数独*/%宏打印sudoku(dsn);goptions hsize=4in vsize=4 in;数据_全部_;设置&dsn;数组c{9}C1-C9;如果n_=1,则执行;rc=ginit();rc=图形(‘clear’);结束;rc=gset(‘重量’,4);rc=gset('texfont',“瑞士”);do h=1至9;rc=gdraw(‘巴’,100*(h-1)/9100*(9-_n_)/9100x(h)/9100X(10-_n_)/9);如果c{h}~=。然后rc=gdraw(‘文本’,100*(h-1)/9+4.5100*(9-n)/9+4.5,put(c{h},1.));结束;rc=gset(‘线宽’,3);rc=gdraw('line',2,0,0,0,100);rc=gdraw(‘线’,2100/3,100/3,0,100);rc=gdraw(‘线’,2200/3,200/3,0,100);rc=gdraw(‘线’,2100100100,0100);rc=gdraw(‘线’,2,0,100,0,0);rc=gdraw(‘线’,2,0,100,100/3,100/3);rc=gdraw(‘线’,2,0,100,200/3,200/3);rc=gdraw(‘线’,2,0100100100);如果n_=9,则执行;rc=图形('update');rc=gterm();结束;运行;标题;%修正print_sudoku;%print_sudoku(indata);数据indata;输入C1-C9;数据线;. . 5 . . 7 . . 1. 7 . . 9。三。. . . 6 . . . . .. . 3 . . 1。5. 9 . . 8 . . 2 .1。2 . . 4。. . 2 . . 6 . . 9. . . . 4 . . 8 .8 . . 1。5 . .;运行;%宏存储初始值;/*将初始值存储到宏变量C_i_j中*/数据_全部_;集合indata;数组C{9};do j=1至9;i=否;调用信号(compress('C_'||put(i,best.)||'_'|put(j,best..)),put(C[j],最佳);结束;运行;%修复存储初始值;%存储初始值;%宏观求解;proc-clp-out=输出数据;/*声明变量*//*九行约束*/%do i=1%至9;var(X_&i._1-X_&i._9)=[1,9];所有差异(X_&i._1-X_&i._9);%结束;/*九列约束*/%do j=1%至9;所有差异(%do i=1%至9;X_&i._&j%结束;);%结束;/*九个3x3块约束*/%dos=0%至2;%t=0%至2;所有差异(%do i=3*&s+1%到3*&s+3;%do j=3*&t+1%到3*&t+3;X_&i._&j%结束;%结束;);%结束;%结束;/*将变量初始化为单元格值*//*如果C_i_j不缺失,则X_i_j=C_i_j*/%do i=1%至9;%do j=1%至9;%如果&&C_&i._&j无。%然后%do;lincon X_&i._&j=&C_&i._&j;%结束;%结束;%结束;运行;%放置&_ORCLP_;%修复解决;%解决%宏convert_to_sense(n);/*将解转换为密集格式的矩阵*/数据输出data_dense;设置数据;数组C{9};%i=1%到&n;%do j=1%to&n;C[&j]=X_&i._&j;%结束;产出;%结束;下降X:;运行;%修复convert_to_density;%convert_to-density(9);%print_sudoku(outdata_dense);原始数据;输入C1-C12;数据线;3 . . 1 5 4 . . 1 . 9 5. 1 . . 3 . . . . 1 3 6. . 4 . . 三。8 . . 2 .5 . . 1。9 2 5 . . 1. 9 . . 5 . . 5 . . . .5 8 1。9 . . 三。6 .. 5 . 8。2 . . 5 5 3. . . . 5 . . 6 . . 1 .2 . . 5 1 5 . . 5 . . 9. 6 . . 4 . 1。3 . .1 5 1 . . . . 5。5 .5 5 . 4 . . 3 1 6 . . 8;运行;%宏打印日期(dsn);goptions重置=标题;goptions hsize=4in vsize=4 in;数据_全部_;设置&dsn;数组c{12}C1-C12;如果n_=1,则执行;rc=ginit();rc=图形(‘clear’);rc=gset(‘重量’,4);rc=gset('texfont',“瑞士”);/*设置颜色*/rc=gset('colrep',1,'black');rc=gset('colrep',2,'cxfde28a');rc=gset('colrep',3,'cxffedaf');rc=gset('colrep',4,'cxbd85ff');rc=gset('colrep',5,'cxd3efe');rc=gset('colrep',6,'cxffdc61');rc=gset('filtype','solid');/*绘制颜色条*/rc=gset('filcolor',2);rc=gdraw('bar',0100100,0);rc=gset('filcolor',3);rc=gdraw('bar',0300/12300/12700/12);rc=gdraw('bar',500/12100/12700/12700/12);rc=gdraw('bar',900/12300/12100700/12);rc=gdraw('bar',300/121000/12900/12100);rc=gset('filcolor',4);rc=gdraw('bar',200/12700/12600/121000/12);rc=gdraw('bar',700/12100/12900/12700/12);rc=gset('filcolor',5);rc=gdraw('bar',300/12100/12500/127);rc=gdraw('bar',600/12700/121000/121000/12);rc=gset('filcolor',6);rc=gdraw('bar',0,0600/12100/12);rc=gdraw('bar',0100/12300/12300/12);rc=gdraw('bar',1000/12700/121001000/12);rc=gdraw('bar',900/121000/12100100);/*绘制网格并填充数字*/rc=gset('filcolor',1);rc=gset('filtype','holl');结束;do h=1至12;rc=gdraw(‘巴’,100*(h-1)/12100*(12-_n_)/12100x(h)/12,100*(13-n_)/12);如果c{h}~=。然后rc=gdraw('文本',100*(h-1)/12+3100*(12-n)/12+3,put(c{h},1.));结束;/*绘制分隔线*/rc=gset(‘彩色’,1);rc=gset(‘线宽’,3);rc=gdraw(‘线’,7,0,0300/12300/12600/122,0,0300/12,300/12,100/12,100/12,0,0);rc=gdraw(‘线’,6,600/12900/12900/12100100600/12100/12,100/12,300/12,300/12,0,0);rc=gdraw(‘线’,4,0,0300/12300/12700/12300/12300/12300);rc=gdraw(‘线’,4,900/12900/12100/12100/12300/12700/12,300/12);rc=gdraw(‘线’,6,0,0300/12300/12200/12700/12100100,1000/12,1000/12,700/12);rc=gdraw(‘行’,6,1000/121000/12900/12900/12100100,700/12,1000/121000/12100100700/12);rc=gdraw(‘线’,4300/12900/12900/12300/1001000/12,1000/12);rc=gdraw(‘线路’,5600/12600/12300/12500/12500/12500,1000/12,700/12700/12700/12100/12100/12);rc=gdraw(‘线’,4,900/12600/12700/12700/12,700/12,100/12);如果n_=12,则执行;rc=图形('update');rc=gterm();结束;运行;%修改打印日期;%打印日期(原始);原始数据;输入C1-C12;数据线;3  .  .  1  5  4  .  .  1  .  9  5.  1  .  .  3  .  .  .  .  1  3  6.  .  4  .  .  三。8  .  .  2  .5  .  .  1  .  .  9  2  5  .  .  1.  9  .  .  5  .  .  5  .  .  .  .5  8  1  .  .  9  .  .  三。6  ..  5  .  8  .  .  2  .  .  5 5 3.  .  .  .  5  .  .  6  .  .  1。2  .  .  5  1  5  .  .  5  .  .  9.  6  .  .  4  .  1  .  .  3  .  .1  5  1  .  .  .  .  5。5  .5  5  .  4  .  .  3  1  6  .  .  8;运行;%宏观数据;/*将每个预先填充的值存储到宏变量C_i_j中*/数据_全部_;设置原始;数组C{12};do j=1至12;i=否;调用信号(compress('C_'||put(i,best.)||'_'|put(j,best..)),put(C[j],最佳);结束;运行;%修复cdata;%cdata;%宏观cons_row(r);/*行r必须包含两个1,两个3,三个5,无7*//*从1到9的其他值各一个*/gcc(X_和r._1-X_和r._12)=((1,2,2)(3,2,2中)(5,3,3)(7,0,0)DL=1DU=1);%修复cons_row;%宏conscol(c);/*c列必须包含两个1、两个3、三个5*//*没有7,其他值从1到9各有一个*/gcc(%dor=1%~12;X_和r._&c。%结束;)=((1,2,2)(3,2,2)(5,3,3)(7,0,0)DL=1DU=1);%修复cons_col;%宏观cons_region(vars);/*包含&vars的Jigsaw区域必须包含两个1*//*两个3分,三个5分,没有7分,一个接一个*//*值从1到9*/gcc(&vars.)=((1,2,2)(3,2,2中)(5,3,3)(7,0,0)DL=1DU=1);%修复社区;%宏pds(solns=allsolns,varsel=MINR,maxt=900);proc-clp-out=pdsout和solnsvarselect=&varsel/*变量选择策略*/最大时间=&maxt;/*时间限制*//*变量X_i_j表示第i行和第j列的网格*/无功功率,无功功率(%do i=1%至12;X_&i._1-X_&i._12%结束;) = [1,9];/*如果C_i_j不缺失,则X_i_j=C_i_ j*/%do i=1%至12;%do j=1%至12;%如果&&C_&i._&j无。%然后%do;lincon X_&i._&j=&C_&i._&j;%结束;%结束;%结束;/*12行约束:*/%dor=1%至12;%cons_row(&r);%结束;/*12列约束:*/%do c=1%至12;%cons_col(&c);%结束;/*12 Jigsaw区域约束:*//*每个拼图区域由宏变量&vars定义*//*区域1:*/%设vars=X_1_1-X_1_3 X_2_1-X_2_3X_3_1X_3_2 X_4_1X_4_2 X_5_1X_5_2;%cons_region(&vars.);/*区域2:*/%设vars=X_1_4-X_1_9 X_2_4-X_2_9;%cons_region(&vars.);/*区域3:*/%设vars=X_1_10-X_1_12 X_2_10-X_2_12X_3_11 X_3_12 X_4_11 X_4_12 X_5_11 X_5_12;%cons_region(&vars.);/*区域4:*/%设vars=X_3_3-X_3_6 X_4_3-X_4_6 X~5_3-X~5_6;%cons_region(&vars.);/*区域5:*/%设vars=X_3_7-X_3_10 X_4_7-X_4_10 X~5_7-X~5_10;%cons_region(&vars.);/*区域6:*/%设变量=X_6_1-X_6_3 X_7_1-X_7_3X_8_1-X_8_3 X_9_1-X_9_3;%cons_region(&vars.);/*区域7:*/%设vars=X_6_4 X_6,5 X_7_4 X7_5 X_8_4 X8_5X_9_4 X_9_ 5 X_10_4 X_10_ 5 X_ 11_4 X_ 11_ 5;%cons_region(&vars.);/*区域8:*/%设变量=X_6_6 X_6~7 X_7~6 X_7_7 X_8_6 X~8_7X_9_6 X_9_ 7 X_10_6 X_10_ 7 X_ 11_6 X_ 11_ 7;%cons_region(&vars.);/*区域9:*/%设vars=X_6_8 X_6~9 X_7_8 X~7_9 X_8_8 X8_9X_9 _8 X_9 X_10 _8 X_10 _ 9 X_11_8 X_11_ 9;%cons_region(&vars.);/*区域10:*/%设vars=X_6_10-X_6_(12)X_7_(10)-X_7_12X_8_10-X_8~12 X_9_10-X_ 9_12;%cons_region(&vars.);/*区域11:*/%设vars=X_10_1-X_10_3 X_11_1-X_11_ 3 X_12_1-X _12_6;%cons_region(&vars.);/*区域12:*/%设vars=X_10_10-X_10~12 X_11_10-X_11_ 12 X_12_7-X_12_ 12;%cons_region(&vars.);运行;%放入&_ORCLP_;%修复pds;%pds;/*将解转换为密集格式的矩阵*/%宏pds_out;数据pdsoutsq;设置pdsout;数组C{12};%do i=1%至12;%do j=1%至12;C[&j.]=X_&i._&j。;%结束;产出;%结束;下降X:;运行;proc打印数据=pdsoutsq;标题“Pi Day Sudoku 2008”;运行;%修复pds_out;%pds输出;%打印日期(pdsoutsq);%宏观魔术(n);%输入n=&n;/*魔法常数*/%设总和=%eval((&n*(&n*&n+1))/2);proc-clp-out=magic&n评估最大时间=3;/*X_i_j=条目(i,j)*/%i=1%到&n;var(X_&i._1-X_&i._&n)=[1,%评估(&n*&n)];%结束;/*行总和*/%i=1%到&n;林肯0%do j=1%to&n;+X_&i._&j%结束;=&sum;%结束;/*列总和*/%do j=1%to&n;林肯0%i=1%到&n;+X_&i._&j%结束;=&sum;%结束;/*对角线:从左上到右下*/林肯0%i=1%到&n;+X_&i._&i%结束;=&sum;/*对角线:从右上到左下*/林肯0%i=1%到&n;+X_%评估(&n+1-&i)_&i%结束;=&sum;/*对称破坏*/林肯X_1_1+1<=X_&n._1;lincon X_1_1+1<=X_&n._&n;lincon X_1_&n+1<=X_&n._1;alldiff();运行;%放置&_ORCLP_;%放置&ORCLPEVS_;%修复魔法;%魔术(7);%宏convert_to_density(n);/*将解转换为密集格式的矩阵*/数据magic7_dense;设置magic7;数组C{7};%i=1%到&n;%do j=1%to&n;C[&j]=X_&i._&j;%结束;产出;%结束;下降X:;运行;%修复convert_to_density;%convert_to-density(7);/*打印魔法方块*/%宏print_msq(dsn);goptions hsize=3in vsize=3 in;数据_全部_;设置&dsn;数组c{7}C1-C7;如果n_=1,则执行;rc=ginit();rc=图形(‘clear’);结束;rc=gset(‘重量’,4);rc=gset('texfont',“瑞士”);do h=1至7;rc=gdraw('Bar',100*(h-1)/7.,100*;如果c{h}~=。然后rc=gdraw('text',100*(h-1)/7+4.5100*(7-_n_)/7+4.5,put(c{h},2.));结束;如果n_=7,则执行;rc=图形('update');rc=gterm();结束;运行;%修正print_msq;%打印平方(magic7_dense);