求解九宫幻方

next_permutation() 是一个 C++ STL 函数
头文件:<algorithm>。作用:将当前排列更改为全排列中的下一个排列。注意:函数在 C++ 中是设计用来处理一维序列,因此不能直接用于二维数组。
如果当前排列已经是全排列中的最后一个排列(元素完全从大到小排列),函数返回 false 并将排列更改为全排列中的第一个排列(元素完全从小到大排列);否则,函数返回 true。

#include<stdio.h>
#include<algorithm>
using namespace std;//C++中的标准库中的所有功能都被包含在std命名空间中 
int p[10],a[5][5],b[5][5],c[5][5];
int main()
{
	int i = 0;
	int j = 0;
	int ans = 0;
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			scanf("%d",&a[i][j]);	
		}	
	}
	for(i=1;i<=9;i++)
	{
		p[i] = i;
	}
	do{
		b[0][0] = p[1];
		b[0][1] = p[2];
		b[0][2] = p[3];
		b[1][0] = p[4];
		b[1][1] = p[5];
		b[1][2] = p[6];
		b[2][0] = p[7];
		b[2][1] = p[8];
		b[2][2] = p[9];
		bool check = true;
		for(i=0;i<3;i++)
		{
			for(j=0;j<3;j++)
			{
				if(!a[i][j])continue;
				if(a[i][j]!=b[i][j])check = false;
			}
		}
		if(!check)continue;
		int sum = 0;
		sum = b[0][0]+b[1][1]+b[2][2];
		if(sum!=b[0][2]+b[1][1]+b[2][0])continue;
		int t1 = 0;
		int t2 = 0;
		for(i=0;i<3;i++)
		{
			t1 = 0;
			t2 = 0; 
			for(j=0;j<3;j++)
			{
				t1 += b[i][j];
				t2 += b[j][i];		
			}
			if(sum!=t1||sum!=t2)check = false;
		}
		if(!check)continue;
		ans++;
		if(ans>1)
		{
			printf("Too Many\n");
			return 0;
		}
		else
		{
			for(i=0;i<3;i++)
			{
				for(j=0;j<3;j++)
				{
					c[i][j] = b[i][j];
				}
			}
		}
	}while(next_permutation(p+1,p+1+9));
	//给出的矩阵至少能还原出一组可行的三阶幻方
	for(i=0;i<3;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("%d ",c[i][j]);
		}
		printf("\n");
	}	
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 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` 函数求解,最后输出结果。如果求解成功,会输出求解后的九宫图;如果无解,会输出 "无解!"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值