新聞中心

        回朔算法2

        作者: 時間:2016-12-01 來源:網絡 收藏
        void TuiLi::SD_in()

        {
        //獲取題目信息
        int data[]={0,5,0,0,3,0,0,0,0,
        0,0,1,6,0,0,9,0,8,
        3,0,0,0,0,0,0,0,0,
        0,0,0,8,0,0,0,0,0,
        0,0,0,0,0,0,7,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0};
        int i,j,z=0;
        for(i=0;i<9;i++)
        for(j=0;j<9;j++)
        {
        SD[i][j]=data[z];
        z++;
        }
        sd_in();

        本文引用地址:http://www.104case.com/article/201612/324288.htm

        }

        void TuiLi::sd_out()
        {
        int i,j,z=0;
        for(i=0;i<9;i++)
        for(j=0;j<9;j++)
        {
        SD[i][j]=sudu[z];
        z++;
        }
        }

        void TuiLi::sd_print()
        {
        int i,j,z=0;
        sd_out();
        GetLocalTime(&TIME);//獲得系統當前時間
        printf("找到一個數獨解獲取時間為:%d年%d月%d日%d時%d分%d秒",TIME.wYear,TIME.wMonth,TIME.wDay,TIME.wHour,TIME.wMinute,TIME.wSecond);
        for(i=0;i<9;i++)
        {
        printf(" ");
        for(j=0;j<9;j++)
        {
        printf("%d ",SD[i][j]);

        }
        printf("");
        }
        printf("");
        }

        int TuiLi::ok_sd() //解數獨用剪枝函數
        {
        int i,j,x;
        sd_out();

        for(x=0;x<9;x++)
        for(i=0;i<9;i++)
        for(j=i+1;j<9;j++)
        {
        if(SD[x][i]==SD[x][j]&&SD[x][i]!=0) return 1;
        }
        //不允許行重復

        for(x=0;x<9;x++)
        for(i=0;i<9;i++)
        for(j=i+1;j<9;j++)
        {
        if(SD[i][x]==SD[j][x]&&SD[i][x]!=0) return 1;
        }
        //不允許列重復

        return 0;
        }

        int TuiLi::go_sd() //解數獨入口函數
        {
        int i,c=0;
        //獲取題目信息
        SD_in();
        //回溯根節點初始值,調整這個值能調整回溯進度
        if(!sudu_ji[0])sudu[0]=1;
        i=0;
        while(1)
        {
        //sd_print();
        //Sleep(10);
        if(sudu[i]<=9)
        {
        //回溯點取值在正常范圍內
        if(ok_sd())
        {
        //如果和剪枝條件沖突,嘗試下一個可用值
        if(!sudu_ji[i])sudu[i]++;
        continue;
        }
        if(i>=80)
        {
        //已經到了最后一個節點也就是找到了一個解先輸出它
        sd_print();
        //然后嘗試找到其它的解
        if(!sudu_ji[80])sudu[80]++;
        c++;
        if(c>=10)
        {
        printf("此題解太多只輸出前面10個解!");
        return 0;
        }
        continue;
        }
        //回溯點值沒有產生沖突擴展他嘗試開始下一個節點
        i++;
        if(!sudu_ji[i])sudu[i]=1;
        }else
        {
        //超過回溯點取值范圍
        //此回溯點已死復位
        if(!sudu_ji[i])sudu[i]=0;
        //退回前一回溯點
        i--;
        if(sudu_ji[i]) i--;//回溯后的當前回溯節點是題目已經標記過的就在往前回溯一步

        if(i<0)
        {
        printf("已經找出數獨所有解共有:%d個解!",c);
        return 1;
        }
        //嘗試對上一回溯點進行擴展
        if(!sudu_ji[i])sudu[i]++;
        continue;
        }
        }

        return 0;
        }

        void TuiLi::hh_init()
        {
        //數據初始化
        int i,j;
        printf("請輸入皇后問題的解題規模:");
        scanf("%d",&N);
        printf("");
        for(i=0;i<1024;i++)
        {
        hh[i]=0;
        }
        for(i=0;i<30;i++)
        for(j=0;j<30;j++)
        {
        HH[i][j]=0;
        }
        }


        上一頁 1 2 下一頁

        關鍵詞: 回朔算法題目信

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 清河县| 普定县| 临朐县| 青河县| 蒙阴县| 临海市| 安溪县| 洞头县| 翁源县| 柳州市| 荔浦县| 兴仁县| 镇远县| 安多县| 东方市| 潢川县| 合肥市| 东城区| 安塞县| 开封县| 依兰县| 开阳县| 湛江市| 保德县| 宜宾县| 鄂托克旗| 游戏| 伊川县| 清水县| 梨树县| 兴业县| 米泉市| 香河县| 洛宁县| 旺苍县| 鹤庆县| 新闻| 奇台县| 新巴尔虎右旗| 泰和县| 诏安县|