一个棋盘,一个格子放一个棋子,要求横竖不能有多个棋子,有多少种放法?

snailanger 2013-12-29 08:01:25
一个棋盘,一个格子放一个棋子,要求横竖不能有多个棋子,有多少种放法?
求一个递归算法
...全文
458 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mourinho 2013-12-29
  • 打赏
  • 举报
回复
n皇后的阉割版。。。 注释的部分为:结果输出和n皇后斜线部分的判断 以下代码就是答案~

package com.zyc.homework;

/**
 * n皇后问题
 * 
 * 1皇后有1种解 2皇后有0种解 3皇后有0种解 4皇后有2种解 5皇后有10种解 6皇后有4种解 7皇后有40种解 8皇后有92种解 9皇后有352种解
 * 10皇后有724种解 11皇后有2680种解 12皇后有14200种解 13皇后有73712种解 14皇后有365596种解
 * 
 * @author zyc
 * 
 */
public class Homework02 {
	static final char QUEEN = 'Q';
	static final char STAR = '*';

	static int _count = 0;

	public static void main(String[] args) {
		nQueen(8);
	}

	static void nQueen(int n) {
		if (n < 1) {
			System.out.println("参数错误");
			return;
		}
		// 初始化数组,全部为'*'
		char[][] arr = new char[n][n];
		for (int i = 0; i < arr.length; ++i) {
			for (int j = 0; j < arr.length; ++j) {
				arr[i][j] = STAR;
			}
		}
		// 递归解n皇后
		nQueen(arr, 0, n);
		System.out.printf("%d皇后有%d种解\n", n, _count);
	}

	static void nQueen(char[][] arr, int row, int max) {
		// 数量达到n个输出
		if (row == max) {
//			output(arr);
			++_count;
			return;
		}
		// 按列遍历
		for (int col = 0; col < arr.length; ++col) {
			// 如果发现这个格子可以放,就继续递归遍历
			if (canPut(arr, row, col)) {
				arr[row][col] = QUEEN;
				nQueen(arr, row + 1, max);
				// 不要忘记设回来,否则下次遍历出错
				arr[row][col] = STAR;
			}
		}
	}

	static boolean canPut(char[][] arr, int row, int col) {
		// 判断竖线
		for (int i = 0; i < row; ++i) {
			if (arr[i][col] == QUEEN) {
				return false;
			}
		}
//		// 判断左上对角线
//		for (int i = row, j = col; i > 0 && j > 0; --i, --j) {
//			if (arr[i - 1][j - 1] == QUEEN) {
//				return false;
//			}
//		}
//		// 判断右上对角线
//		for (int i = row, j = col; i > 0 && j < arr.length - 1; --i, ++j) {
//			if (arr[i - 1][j + 1] == QUEEN) {
//				return false;
//			}
//		}
		return true;
	}

	// 输出数组
	static void output(char[][] arr) {
		System.out.println("----------------");
		for (int i = 0; i < arr.length; ++i) {
			for (int j = 0; j < arr.length; ++j) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
	}
}

内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧