用java语言编写程序计算九宫图

前言

对于程序员来说,用程序解决数学问题是最有趣的事情之一。本人研究了一个能够轻易计算九宫图的算法,并且用java语言编写程序得以实现。现将算法和代码公布,欢迎广大程序爱好者前来阅读、交流。

九宫图简介

九宫图是我国古老的数学问题,也是一种数字艺术,就是把1~9九个数字填到3行3列九个方格中,使其每一横、坚、斜行之和都等于15。如下图就是九宫图:

在这里插入图片描述

编程思想

要计算九宫图,我首先想到的是找数字规律。对于九宫图而言,以每个边角数字(如4)为首位,都能有3组不重复的数字组合的和为15。例如上图中以4为开头则有4、9、2,和4、3、8和 4、5、6三组数字之和为15。如果仅要求第一个数字是4,后两个数字可以颠倒位置,则这样的数字组合有6种。同理以中央数字为开头,在后两个数字可以颠倒位置的情况下,会有8个数字组合的和为15。利用这一规律,我们可以轻易得到九宫图中的4个拐角数字和1个中央数字,其他数字就可轻易计算出。

算法

1、创建全局的一个数组和一个int型变量分部用来存储4个边角数字和1个中央数字。设置标记数字d=0;
2、利用三层for循环将第一、第二、第三个数字均从1开始累加,到9为止,中间嵌套if判断语句保证三个数字不相等。
3、在for循环的最内层计算三个数字之和,如果等于15,则标记数字d自增1,表示已经找到一组和为15的数字组合。
4、在循环的最外层,也就是第一个数字不变,后面两个数字取任意不重复值取完之后,利用if语句进行判断,如果d的值自增到了6,则说明找到了边角数字,存入数组;如果d的值自增到了8,则说明得到了中央数字,需要赋值存储。如果d的值自增到了4,说明此时是每一行中间的数字,但是这个数字我们不需要存储。
5、每次d分别自增到4、6、8时,说明此时内部的两层循环已经结束,第一个数字即将自增1再重新开始内部的两层循环,此时需要将d的值重新归0,以便计算不同的首位数字的到和为15的数字组合个数。
6、当得到4个边角数字和1个中央数字之和,再计算每一行中间的数字就特别简单了,只需要用15减去两个就行。
7、所有数字就得到以后,就可以展示出来。

程序代码

package InterestingProgram ;
public class JiuGongTu {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int d=0;
		int i=0;
		//创建int数组,用来存储4个边角数字
		int[] corner=new int[4];
		//center用来存储中央的数字
		int center = 0;
		for(int a=1;a<10;a++){			
			for(int b=1;b<10;b++){				
				if(a!=b){
					for(int c=1;c<10;c++){						
						if(a!=c&&b!=c){
							int x=a+b+c;
							if(x==15){
								d++;
							}													
						}					
					}					
				}					
			}
			if(d==6){
				System.out.println("得到边角数字是"+a);
				corner[i]=a;
				i++;
				d=0;				
			}
			
			if(d==4){
				d=0;
			}
			if(d==8){
				System.out.println("得到中央数字是"+a);
				center=a;
				d=0;			
			}
			
		}
		//第一行中间的数字为
		int m1=15-corner[0]-corner[1];
		
		//最后一行中间的数字为
		int m2=15-corner[2]-corner[3];
		
		//左边列中间的数字为
		int m3=15-corner[0]-corner[2];
		
		//左边列中间的数字为
		int m4=15-corner[1]-corner[3];
		System.out.println("九宫图如下:");
		System.out.println(corner[0]+"  "+m1+"  "+corner[1]);
		System.out.println(m3+"  "+center+"  "+m4);
		System.out.println(corner[2]+"  "+m2+"  "+corner[3]);

	}

}

运行效果

在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是用 C 语言实现求解九宫的程序: ```c #include <stdio.h> #include <stdbool.h> #define SIZE 9 // 定义九宫大小 int puzzle[SIZE][SIZE]; // 存储九宫的二维数组 // 检查当前数字是否可放置在该位置 bool is_valid(int row, int col, int num) { // 检查当前行和列是否有重复数字 for (int i = 0; i < SIZE; i++) { if (puzzle[row][i] == num || puzzle[i][col] == num) { return false; } } // 检查当前宫格是否有重复数字 int start_row = row / 3 * 3; int start_col = col / 3 * 3; for (int i = start_row; i < start_row + 3; i++) { for (int j = start_col; j < start_col + 3; j++) { if (puzzle[i][j] == num) { return false; } } } return true; } // 递归求解九宫 bool solve(int row, int col) { // 如果已经到达最后一个格子,返回 true 表示已经求解成功 if (row == SIZE) { return true; } // 如果当前格子已经有数字,则跳过继续求解下一个格子 if (puzzle[row][col] != 0) { if (col == SIZE - 1) { return solve(row + 1, 0); } else { return solve(row, col + 1); } } // 尝试在当前格子放置数字 1~9 中的一个 for (int i = 1; i <= 9; i++) { if (is_valid(row, col, i)) { puzzle[row][col] = i; if (col == SIZE - 1) { if (solve(row + 1, 0)) { return true; } } else { if (solve(row, col + 1)) { return true; } } puzzle[row][col] = 0; } } return false; } int main() { // 初始化九宫 printf("请输入九宫,空格用 0 表示:\n"); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { scanf("%d", &puzzle[i][j]); } } // 求解九宫 if (solve(0, 0)) { printf("求解成功,结果为:\n"); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%d ", puzzle[i][j]); } printf("\n"); } } else { printf("无解!\n"); } return 0; } ``` 在程序中,`puzzle` 数组用来存储九宫,其中空白格用 `0` 表示。`is_valid` 函数用来检查当前数字是否可放置在该位置,`solve` 函数是递归求解九宫的主要函数。程序先读入九宫,然后调用 `solve` 函数求解,最后输出结果。如果求解成功,会输出求解后的九宫;如果无解,会输出 "无解!"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值