N皇后问题(C语言)—回溯法

一、问题描述

问题描述:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即不能处于同一列或同一行,也不能处在同一斜线上,请问有多少种摆法?

8皇后问题

 

 不能放皇后的位置及位置之间的关系:

 

二、代码实现

#include <stdio.h>

int array[20];//数组大小,a[i] = j表示第i个皇后放在第i行的第j个位置 
int n,cnt;//n为皇后的个数 

int check(int x,int y)//x为行,y为放置的位置 
{
	int i = 1;
	for(;i <= x ;i++)
	{
		if(array[i] == y)return 0;//前面几行已经在y位置上有元素 
		if(array[i] + i == x + y)return 0;//上右下左对角线
		if(i - array[i] == x-y)return 0;//上左下右对角线 
	}
	return 1;
}
void dfs(int row)//第row个皇后 
{
	int i,j;
	if(row == n+1)//此时已有一个解
	{
		cnt++;
		for(j=1;j<=n;j++)
		{
			printf("%d ",array[j]);
		}
		printf("\n");
		return ;
	}
	for(i = 1;i <= n;i++)//从一横排的所有位置开始,判断是否该位置能放皇后 
	{
		if(check(row,i)) //第row个皇后能否放在i位置
		{
			array[row] = i;
			dfs(row+1);//接着放下一个
			array[row] = 0;//回溯 
		} 
	}
}
void main()
{
	scanf("%d",&n);
	dfs(1);
	printf("%d个皇后一共有%d个解",n,cnt);
} 

三、运行结果 

 

 四、总结

主要是要搞清楚不能放的位置之间的数字关系

 

  • 8
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
n皇后问题是经典的回溯算法问题,其解法可以用C语言实现。下面是一个简单的C语言实现: ```c #include <stdio.h> #define MAX_N 20 int n; // 皇后个数 int map[MAX_N][MAX_N]; // 记录棋盘状态 int count = 0; // 记录解的个数 // 输出结果 void print_result() { printf("Solution %d:\n", count); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%c ", map[i][j] == 1 ? 'Q' : '.'); } printf("\n"); } printf("\n"); } // 检查位置是否合法 int check_pos(int row, int col) { for (int i = 0; i < row; i++) { if (map[i][col] == 1) // 检查同一列 return 0; if (col-i-1 >= 0 && map[row-i-1][col-i-1] == 1) // 检查左上角 return 0; if (col+i+1 < n && map[row-i-1][col+i+1] == 1) // 检查右上角 return 0; } return 1; } // 回溯求解 void backtrack(int row) { if (row >= n) { count++; print_result(); return; } for (int i = 0; i < n; i++) { if (check_pos(row, i)) { map[row][i] = 1; backtrack(row+1); map[row][i] = 0; } } } int main() { printf("Input the number of queens: "); scanf("%d", &n); backtrack(0); printf("Total solutions: %d\n", count); return 0; } ``` 在这个实现中,我们使用一个二维数组 `map` 记录棋盘状态,其中 `map[i][j]` 表示第 i 行第 j 列是否放置了皇后。`check_pos` 函数用于检查当前位置是否合法,如果不合法则返回 0,否则返回 1。在 `backtrack` 函数中,我们对每一行依次遍历棋盘的每一列,如果当前位置合法,则在该位置放置皇后,并递归处理下一行。如果最后一行也放置了皇后,则输出结果。在回溯时需要将当前位置重新置为 0。 该实现可以在输入皇后个数后输出所有的解,并统计解的总个数。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenshengnannn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值