棋盘问题,求解和为15的棋盘游戏问题

问题描述

棋盘问题,求解和为15的棋盘游戏问题

求解和为15的棋盘游戏问题,求解和为15的棋盘游戏问题,求解和为15的棋盘游戏问题

解决方案

package chapter_four;

public class J_Grid15 {
int [] [] m_board;

J_Grid15(){
    m_board = new int [3][3];
}

//输出棋盘的格线行
private void mb_outputGridRowBoard(){
    int i;
    System.out.print("+");
    for(i=0; i<5; i++){
        System.out.print("-");
    }
    System.out.println("+");
}

//输出棋盘的数据行
private void mb_outputGridRowBoard(int i){
    int j;
    for(j=0; j< m_board.length; j ++){
        System.out.print("|"+m_board[i][j]);
    }
    System.out.println("|");
}

//输出棋盘
public void mb_outputGrid(){
    int i;
    mb_outputGridRowBoard();
    for(i=0; i< m_board.length; i++){
        mb_outputGridRowBoard(i);
        mb_outputGridRowBoard();
    }
}

//初始化数据
private void mb_dataInit(){
    int i,j,k;
    for(i=0, k=1; i < m_board.length; i++){
        for(j=0; j < m_board.length; j++,k++)
            m_board[i][j] = k;
    }
}

//数据结束检测
//这里琼穷举是由后面开始不断的由1-9的变化,所以棋盘的数字位置回到初始化状态,那么穷举结束
private boolean mb_dataEnd(){
    int i,j,k;
    for(i=0,k=9; i < m_board.length; i++)
        for(j=0; j < m_board.length; j++,k--)
            if(m_board[i][j] != k)
                return false;
    return true;
}

//取下一个数据
//这里取下一个数据就是后面的棋盘位置不断从1-9变化,举一个例子,
//当第7,8,9的位置的值为1,2,3,则下一个值为124,然后是125.。。。。。131,139,141。。。。
private void mb_dataNext(){
    int i,j;
    for(i = m_board.length-1; i>=0; i--)
        for(j = m_board.length-1; j>=0; j--)
            if(m_board[i][j] ==9)
                m_board[i][j] = 1;
            else{
                m_board[i][j] ++;
                return;
            }
}

//数据检测:判断数据中是否含有相同的数字
//这里认真看会明白的,就是如果有相同的数字,则1-9的位置必定有空值,所以j会不等于9
private boolean mb_dataCheckDifferent(){
    int i,j;
    int [] digit = new int [10];
    for(i = 0 ; i < m_board.length; i++){
        for(j = 0; j < m_board.length; j ++)
            digit[m_board[i][j]] = 1;
    }
    for(i = 1,j=0; i< digit.length; i++){
        j+= digit[i];
    }
    if( j == 9)
        return true;
    return false;
}

//数据检测:各行和是否为15
private boolean mb_dataCheckSumRow(){
    int i,j,k;
    for(i=0; i < m_board.length; i++){
        for(j=0,k=0; j<m_board.length; j++)
            k+= m_board[i][j];
        if (k!=15)
            return false;
    }
    return true;
}

//数据检测:各列和是否为15
private boolean mb_dataCheckSumColumn(){
    int i,j,k;
    for(i=0; i < m_board.length; i++){
        for(j=0,k=0; j<m_board.length; j++)
            k+= m_board[j][i];
        if (k!=15)
            return false;
    }
    return true;
}

private boolean mb_dataCheck(){
    if (!mb_dataCheckDifferent())
        return false;
    if (!mb_dataCheckSumRow())
        return false;
    if (!mb_dataCheckSumColumn())
        return false;

    //检测对角线的和是否为15
    if (m_board[0][0] + m_board[1][1] + m_board[2][2] != 15)
        return false;
    if (m_board[0][2] + m_board[1][1] + m_board[2][0] != 15)
        return false;
    return true;
}

//求解并输出棋盘问题
public void mb_arrage(){
    int n=1;
    for( mb_dataInit(); !mb_dataEnd(); mb_dataNext()){  //mb_dataEnd若返回false则继续,否则结束循环
        if(mb_dataCheck()){
            System.out.println("第"+n+"个结果:");
            n++;
            mb_outputGrid();
        }
    }
}

public static void main(String args[])
{
    J_Grid15 a = new J_Grid15();
    a.mb_arrage();
}

}

以上和为15的棋盘游戏的代码,对于我这个初学者来说,其实那两个mb_dataEnd() ,mb_dataNext() 函数的理解花了一些时间

因为上网查找资料,没有解释这两个函数,然后我就在这说说:

这是一个穷举过程,即每一种可能都列举了,我举一个例子:

例如在棋盘的m_board[2][0]、m_board[2][1]、m_board[2][2]分别为1、2、3,使用一次mb_dataNext() 函数后变成1、2、4

使用第二次mb_dataNext() 函数后变成1、2、5 .... ....

到1、2、9时,再使用就是1、3、1,............

不断使用, 到1、9、9时,再使用则变成2、1、1......... 之后是2、1、2

这样不断穷举,产生很多组数,判断时候满足和为15,满足则输出!!!

mb_dataEnd() 就不用说了吧,穷举回到初始状态就结束,使得每一种情况都出现过.....

解决方案二:

http://download.csdn.net/detail/csrych/3254299

时间: 2024-09-06 16:51:30

棋盘问题,求解和为15的棋盘游戏问题的相关文章

求助——求解和为15的游戏棋盘问题

问题描述 publicclassGrid15{int[][]board;Grid15(){board=newint[3][3];}//输出棋盘的格线行privatevoidoutputGridRowBoard(){inti;System.out.print("+");for(i=0;i<5;i++){System.out.print("-");}System.out.println("+");}//输出棋盘的数据行(第i行,i只能为0.1或

《中国人工智能学会通讯》——9.19 应 用

9.19 应 用 我们利用 LDL 已经解决了大量实际问题.这一过程中,最为关注的问题之一在于标记分布数据的获取.其中,有的标记分布来源于先验知识[11-12] :有的标记分布直接来源于数据本身[13-14] :有的标记分布是从数据中学习得来的[15-16] . 作为最早的一个应用,首先将 LDL 用于人脸年龄估计[11] .对于人脸年龄估计,其最大的问题在于缺少充足且完整的训练数据.考虑到人脸的老化是一个缓慢.渐进的过程,引入了一种特殊的标记分布:描述度在实际年龄上最高,并逐渐向其两边相邻年龄

C++第15周项目6——存储棋盘

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目6-体会棋盘游戏中的数据存储] 定义一个8行8列的二维数组a[8][8]. (1)为二维数组中的数据赋50以内的随机数(程序模板中setdata()函数已经完成,利用产生随机数的系统函数实现),可能的取值如上图所示: (2)设计函数out()按行输出二维数组中的数据: (3)设计函数outDiagonal()输出从左上到右下对角线上的元素的值,如对图的数据而言,输出

《C语言程序设计:问题与求解方法》——2.15节算术表达式

2.15 算术表达式 所谓算术表达式是用一个或多个算术运算符将运算量(包括常量.变量.函数调用)连接起来的,可以计算出明确值的式子.比如,b b – 4 a c. ab*sin(alfa)/2.0就是算术表达式. 算术表达式是用得最多的一种表达式,在完成计算一个数值的工作时通常要使用它. 如果算术表达式中有两个以上算术运算符,各运算符按照什么先后顺序进行运算?这要分以下三种情况来讨论: 1)由运算符固有的优先级来确定. 在C语言的全部算术运算符中,取负数(–)这个一元运算符优先级最高:*./.%

2013级C++第15周项目——二维数组

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-折腾二维数组]创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中.输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"),再将数组"倒"着输出(即最后一行最后一列的最先输

2013-C++第15周项目参考解答链接集

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-折腾二维数组]创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中.输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"),再将数组"倒"着输出(即最后一行最后一列的最先输

C++程序设计-第15周数组上机实践项目

回到课程主页,链接:C++程序设计课程主页-2012级 本次上机对应的教学内容:第5章   数组 - 二维数组.字符串 [项目1-折腾二维数组]创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中.输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"),再将数组"倒"着输出(即最后一行最后一列的最先输出,第

八皇后问题的递归求解

八皇后问题的递归算法 #include <stdio.h>#include <stdlib.h>#define N 8        /* 棋盘边长  */#define XXN     15 /* 正(反)对角线个数 */#define TRUE 1#define FALSE 0 int map[N][N];/* 棋盘     */ int col[N];   /* 列       */int XX[XXN];  /* 正对角线 */int YY[XXN];  /* 反对角线 *

使用VB求解华容道问题

问题 1.问题的提出 1.1"华容道"简介 "华容道"是一种中国古代的智力游戏玩具,在一个宽为4,长为5的矩形框中,有10个棋子,包括一个曹操,五虎上将,四个小卒,要求在各个棋子不重叠的情况下进行移动,最有将曹操从棋盘上方移动到下边中央为成功.由于五员大将可以横放也可以竖放,有许多种排列方法,因而可以形成非常复杂的棋局,人们还给常用的棋局起了很多好听的名字,例如下图就是"横刀立马"的布局图. 图1.1 "横刀立马"的布局 关于