15-谜问题

问题描述:

在一个分成16格的方形棋盘上,放有15块编了号码的牌。对这些牌给定一种初始排列,要求通过一系列的合法移动将这一初始排列转换成目标排列。

这个问题解决时用到了L-C检索。在检索的过程中计算估值函数c(x)=f(x)+g(x);

通过比较估值函数确定遍历的方向。L-C检索是有智力的搜索。

package lc_search;

public class Riddle_15 {
    Riddle_15(){}
    public class A implements Cloneable{ //棋盘的抽象类
        private int[][] a;//棋盘数组
        private int x;//空格所在x坐标
        private int y;//空格所在y坐标
        A(){
            int[][] b = { //棋盘
                    {5,1,2,4},
                    {0,6,3,8},
                    {9,10,7,11},
                    {13,14,15,12}
            };
            a = b;
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    if(a[i][j] == 0){
                        x = i;
                        y = j;
                    }
                }
            }
        }
        public void show(){//打印棋盘
            System.out.println("---------------------------------");
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if(a[i][j] == 0)
                        System.out.print("|"+" "+"\t");
                    else
                        System.out.print("|"+a[i][j]+"\t");
                }
                System.out.println("|");
                System.out.println("---------------------------------");
            }
        }
        public void set(int x,int y){//移动空格
            if(Math.abs(x)>1||Math.abs(y)>1){
                System.out.println("-1");
                return;
            }
            x = this.x + x;
            y = this.y + y;
            if (x < 0 || x >= 4 || y < 0
                    || y >= 4) {// 检测能否朝某个方面移动
                return;
            } else {// 移动
                a[this.x][this.y] = a[x][y];
                a[x][y] = 0;
                this.x = x;
                this.y = y;
            }
        }
        public Boolean test(){//开局判断棋盘是否可解
            int x = (this.x+this.y)%2 ;//空格初始位置决定
            int count = 0;
            a[this.x][this.y] = 16;//对空格需要做一定的处理Position[空格] = 16
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    //if(a[i][j] == 0)//排除空格这一异常点
                    //    continue L1;
                    for(int k=j+1;k<4;k++){//处理本行未完元素
                        if(a[i][k]<a[i][j])
                            count++;
                    }
                    for(int k=i+1;k<4;k++){//处理接下来的几行
                        for(int l=0;l<4;l++){
                            if(a[k][l]<a[i][j])
                                count++;
                        }
                    }
                }
            }
            a[this.x][this.y] = 0;
            if((count+x)%2 == 1){
                System.out.println("目标不可达!"+(count+x));
                return false;
            }
            //System.out.println("test");
            return true;
        }
        public int g(){//估值函数
            int g = 0;
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (a[i][j] != i * 4 + j + 1)
                        g++;
                }
            }
            return g-1;
        }
        public Object clone() throws CloneNotSupportedException{//数组需要深拷贝
            A a = (A)super.clone();
            //b.show();
            a.a = new int[4][4];
            for(int i=0;i<4;i++){//数组克隆在每一行都要操作
                a.a[i] = this.a[i].clone();//注意此处要用到this指针
            }
            return a;
        }
    }
    public void test() throws CloneNotSupportedException{//测试深度拷贝是否成功
        A a = new A();
        a.show();
        A b = (A)a.clone();
        b.show();
        a.set(1,0);
        b.show();

    }
    public void search() throws CloneNotSupportedException{//检索函数
        A a = new A();//用于存放E节点(当前处理节点)
        if(!a.test()){
            return;
        }
        A aa = new A();//用于存放极优节点
        A aaa = new A();//用与存放父节点
        aa = (A) a.clone();
        int f = 0;// c = f(x) + g(x);
        int g=1000;
        int c=0;
        int min=10000;
        while (g != 0) {
            //System.out.println("aa[][]极优节点:g="+g );
            //aa.show();
            int[] row = {  - 1, 0, 0,  1 };
            int[] column = { 0, - 1,  1, 0 };
            min = 1000;
            f++;
            aaa =(A) a.clone();
            //System.out.println("原棋盘:" );
            aaa.show();
            System.out.println();
            for (int k = 0; k < 4; k++) {//
                a.set(row[k], column[k]);
                g = a.g();
                c = f + g ;
                //System.out.println("a[][]当前处理节点:");
                //a.show();
                if (c < min) {
                    min = c;
                    aa = (A)a.clone();
                }

                a = (A)aaa.clone();
                //System.out.println("a[][]原始棋盘:");
                //aaa.show();
                //a.show();
            }
            a = (A)aa.clone();
        }
        aa.show();
        System.out.println("ok");
    }
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Riddle_15 r = new Riddle_15();
        r.search();
        //r.test();
        return;
    }

}

15-谜问题详细介绍:

时间: 2024-10-13 22:22:49

15-谜问题的相关文章

【谜客帝国】第139届微雨潇潇联想专场(2018.10.15)

[谜客帝国]第139届微雨潇潇联想专场(2018.10.15) 主持:瓷   计分:小白 1.本季重逢在帝国  只身东海挟春雷 乐天曲江之感怀 一段新愁染眉弯 5 今秋复来此 2.寒蛩轻唱送微凉  萧萧梧叶诉离情 白帝有语怜高洁 夜夜龙泉壁上鸣 4 此秋声也 3.人至中年心淡然  我言此季胜春潮 春愁夏恨冬烦忧 吟风作赋只伤春 4 不是悲秋 4.菊残犹有傲霜枝  立冬尚见黄叶飞 子夜歌里玉关情 竞雄洒血化碧涛 5 秋风吹不尽 5.轻寒最是可人天  貂裘换酒也堪豪 姑苏城外寒山寺 斋中结社咏海棠 

【谜客帝国】第145届芭比娃娃主擂谜会(2019.01.15)

[谜客帝国]第145届芭比娃娃主擂谜会(2019.01.15) 主持:瓷   计分:默沫 1. 同心十八载,白首居河东(2字2019亚洲杯中国球员)石柯 2. 王朗气极坠地死(3字方位字)骂下马 [注:典据<三国演义>93回,“王朗听罢,气满胸膛,大叫一声,撞死于马下.”] 3. 城头长弓搭白羽(2字宋词人)张翥 4. 重门折屐未曾进(成语)格格不入 [注:重门.折屐,皆为谜格.] 5.“石城古岸头”(2字国家森林公园)圭山 6. 凯撒大帝显露出愤怒(4字<诗经>名句)七月流火 [

【谜客帝国】第148届梦中人主擂谜会(2019.03.15)

[谜客帝国]第148届梦中人主擂谜会(2019.03.15) 主持:瓷    计分:小白 1.夫人囚禁于何处(5字对景点位置咨询语)娘子关在哪 2.找你去战胜排名第二的人(外教练)索尔斯克亚 3.二月里来换新装(莫言小说<蛙>人物)王胆 4.一心除皇上,自然搭上命(科技名词)全息 5.布什更二(货币冠量)一便士 6.“身形婀娜,虽裹在一袭宽大缁衣之中,仍掩不住窈窕娉婷之态”(3字古埃及国王,卷帘格)美尼斯 [注:面为<笑傲江湖>中对仪琳的描写,美尼斯为是埃及第一王朝的开国国王] 7

【谜客帝国】第150届微雨潇潇联想&amp;灯谜谜会(2019.04.15)

[谜客帝国]第150届微雨潇潇联想&灯谜谜会(2019.04.15) 主持:瓷    计分:晶莹 1.山寺桃花始盛开 才了蚕桑才插田 爱与温暖之佳作 布谷声中夏令新 5 人间四月天 2.幽居在深谷 谢娘之风致 貌略逊黛玉 月夜遇梅仙 4 林下美人 3.有三秋桂子 育桃李满园 效我军劲旅 学仲淹咏梅 4 华中师范 [注:华中师范大学校址桂子山] 4.刮目相看吕蒙 回书效仿刘彻 莽夫手不释卷 落架东湖之滨 4 武汉大学 [注:珞珈山原名落架山] 5.有鲈鱼堪脍 一字救千人 巨鸟之羽翼 宋玉之词赋 1

【谜客帝国】第143届月思主擂谜会(2018.12.15)

 [谜客帝国]第143届月思主擂谜会(2018.12.15) 主持:瓷  计分:默沫 1.“六根清净几人有”(6笔字)伉/月思 [注:面出黄若初<访山寺偶成>,“?,一世荣华百岁无.”] 2. 数点霁霞山外断(3字足球术语)541/月思 3.“鸟上残花枝畔啼”(11笔字)菌/月思 [注:面出谢宗万<道中即景>,“客临古渡岸前望,?.”] 4.“白屋风光难入眼”(列人二,2+2)舍之.景差/月思 [注:面出黄东<山居抚琴>,“?,任凭曲韵释忧愁.”] 5.“任凭曲韵释忧愁

【谜客帝国】第141届幽谷寒梅主擂谜会(2018.11.15)

 [谜客帝国]第141届幽谷寒梅主擂谜会(2018.11.15) 主持:幽谷寒梅  计分:渣渣 1.捧来一掬春,三人分一分(字)拘 2.“薄技在身,胜握千金”(6字爆料某知名演员境况)陈小艺超有钱 3.但觉纣王仁心无存(6字旅游语,含吉林地名)感受德惠风光 [注:纣王名受(一作受德).惠风:仁心.仁政,汉张衡 <东京赋>:“惠风广被,泽洎幽荒.”] 4.并未让其交代(4字比较语,含古尊称)没令坦白 5.“白发垂项,佝偻携杖”(知名谜人专职,掉尾格)老罗背锅 6.毋为威武动屈心(南北朝人物)莫折

【谜客帝国】第137届雪山飞狐主擂谜会(2018.09.15)

[谜客帝国]第137届雪山飞狐主擂谜会(2018.09.15) 主持:瓷   计分:小沪 01.江畔和风临,村前白杨飘(3字中药方剂)枫香汤 02.“天堑变通途”(2字世界体育组织简称)桥联 [注:面出毛[泽]东<水调歌头·游泳>,承上句“一桥飞架南北”.] 03.“彩蟾特地中宵出”(3字纺织品)夜光布 [注:面出宋·曹勋<鹧鸪天>,彩蟾,月亮别称.] 04.停船靠岸处,乃是第一墟(3字河北地名)泊头市 05.山松弄影塘边立(3字清末历史人物)唐景崧 06.“子房以盖世之才”(3字

【谜客帝国】第147届月思主擂谜会(2019.02.15)

 [谜客帝国]第147届月思主擂谜会(2019.02.15) 主持计分:东东 1.“人在中天日月间”(9笔字)春/月思 [注:面出陈孚<开平即事二首>,“势超大地山河上,-.”] 2. 玉漏声中烟气袅(3字法国奢侈品牌)YSL/月思 3. 双双相念初相爱(2字著名动漫人物)菜菜/月思 4.“数点燕云州外.雪霜威”(足球用语二,4+3)4132.451/月思 [注:面出余文<相见欢>,“登高望断龙旗,未曾归.几度中原北定,梦依稀.朔风乱,胡尘漫,掩斜晖.-.”] 5.“十载同心如一人

【烟雨谜曼群】2017年4月15日山涧流水主擂谜会题

[烟雨谜曼群]2017年4月15日山涧流水主擂谜会题 1.男生女生,共同加油(中国河流)黄河2.炎黄子孙了不起(金融机构简称 4字)中国人行3.祖国永远是花季(陕晋吉地名各一 4字)华.夏.长春4.老板出资办谜会(四字称谓)主赞助商5.广西赞歌(屈原篇目)桂颂6.莫忘欢乐时(二字称谓)娱记7.全部说岳(安徽名胜)齐云山8.家有藏书十万卷(央视主持人)居文沛9.水中鱼两尾,枝头鸟一对(国产手机)小米10.成功属于建设人(相声演员)郑健11.营囗出品中国结(10笔字)莹12.水手相邀上抚河(唐代诗僧

【天一家园群】2017年4月15日《浦东谜刊》百家谜会展猜8谜题

[天一家园群]2017年4月15日<浦东谜刊>百家谜会展猜8谜题 1.虎年改变旧面貌(三字词)树新风/石彧2.黄河之水天上来(成语)源远流长/石彧3.三代挖煤做马牛(银行用语)长期无息/石彧4.日日待漏朝君王(教育用语)天天向上/石彧5.阿谀奉承拍马屁(菜谱)溜三样/石彧6.海浪你轻轻地摇(世界女排名将)卡波特/石彧7.人面桃花相映红(美术名词)对比色/石彧8.老君下凡不炼丹(中成药)回天再造丸/石彧9.月光如水水如天(中国地名)三明/石彧10.停车坐爱枫林晚(花名)对红/石彧11.乱落梨花飞