算法:bfs(深度优先搜索)

 

// dfs习题:
// 输入9行,0代表未知
// 输出9行即最终结果
#include <stdio.h>
#include <stdlib.h>
int main() {
	int table[9][9];
	//输入数据
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			scanf("%d", &table[i][j]);
		}
	}

	dfs(table, 0, 0);
	
	return 0;
}

void dfs(int table[9][9], int x, int y)
{
	if (x == 9)
	{
		//打印最终数组数据
		my_print(table);
		exit(0);
	}
	// '0'要填入数字
	if (table[x][y] == 0)
	{
		//循环遍历要填入什么数字
		for (int k = 1; k <= 9; k++)
		{
			//检查行,列,九宫格是否含有该数字
			if (check(table, x, y, k) == 1)
			{
				table[x][y] = k;
				dfs(table, x + (y + 1) / 9, (y + 1) % 9);
			}
		}
		//回溯
		table[x][y] = 0;
	}
	else
	{
		//不是0则遍历下一个位置
		dfs(table, x + (y + 1) / 9, (y + 1) % 9);
	}
}

int check(int table[9][9], int x, int y, int k)
{
	//检查行、列是否含有数字k
	for (int i = 0; i < 10; i++) {
		if (table[i][y] == k || table[x][i] == k) {
			return -1;
		}
	}
	//检查九宫格是否含有数字k
	//x / 9定位所处行,y / 9定位所处列
	x /= 9;
	y /= 9;
	//定位到所处行、列坐标后遍历九宫格
	for (int i = 3 * x; i < 3 * x + 3; i++) {
		for (int j = 3 * y; j < 3 * y + 3; j++) {
			if (table[i][j] == k) {
				return -1;
			}
		}
	}
	//当行、列、九宫格内均不包含该数字返回1
	return 1;
}

//打印最终九宫格内容
void my_print(int table[9][9]) {
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			printf("%d ", table[i][j]);
		}
		printf("\n");
	}
}

 

上一篇:P7480 Reboot from Blue 线段树优化建图跑最短路


下一篇:网络安全笔记-day5,服务器远程管理