当前位置: 首页 > news >正文

DFS-排列数字和n皇后-java实现

DFS

排列数字

思路

很简单直接背模板,从下标0开始dfs,如果下标u=排列数量直接输出path,否则,从1-n看每个数字是否用过st数组,没用过,就让当前下标位置为for的数字path[u]=i,标记用过st[i]=true,dfs下一个位置dfs(u+1),回溯的时候令st[i]=false

代码

import java.util.Scanner ;
public class Main{static int[] path = new int[10];static int n;static boolean[] st = new boolean [10];public static void dfs(int u){if(u==n){for(int i=0;i<n;i++){System.out.printf("%d ",path[i]);}System.out.printf("%n");return;}else{for(int i=1;i<=n;i++){if(!st[i]){path[u] = i;st[i]=true;dfs(u+1);st[i]=false;}}}}public static void main(String[] args){Scanner scan = new Scanner(System.in);n = scan.nextInt();dfs(0);}
}

n皇后

思路:

两种方法,第一种按全排列的思路走一遍,不过判断的地方改成没有同一列,对角线,反对角线冲突这样,思路更简单,推荐记

微信图片_20220505182615.jpg

代码1

import java.util.Scanner ;
public class Main{static char[][] g = new char[20][20];static int n;static boolean[] col = new boolean [20];static boolean[] dg = new boolean [20];static boolean[] udg = new boolean [20];public static void dfs(int u){if(u==n){for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.printf("%c",g[i][j]);}System.out.printf("\n");}System.out.printf("\n");return;}else{for(int i=0;i<n;i++){//这是列数if(!col[i] &&!dg[i+u] &&!udg[i-u+n]){g[u][i]='Q';col[i]=dg[i+u]=udg[i-u+n]=true;dfs(u+1);col[i]=dg[i+u]=udg[i-u+n]=false;g[u][i]='.';}}}}public static void main(String[] args){Scanner scan = new Scanner(System.in);n = scan.nextInt();for(int i=0;i<n;i++){for(int j=0;j<n;j++)g[i][j]='.';}dfs(0);//这是行数}
}

思路2

更原始的写法,每个位置判断放不放皇后

代码2

import java.util.Scanner ;
public class Main{static char[][] g = new char[20][20];static int n;static boolean[] col = new boolean [20];static boolean[] row = new boolean [20];static boolean[] dg = new boolean [20];static boolean[] udg = new boolean [20];public static void dfs(int x, int y, int s){//x是行 y是列if(y==n){y=0;x=x+1;//换行}if(x==n){//最后一行判断皇后放完了吗if(s==n){for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.printf("%c",g[i][j]);}System.out.printf("\n");}System.out.printf("\n");}return ;}//分放皇后和不放皇后两种情况dfs(x,y+1,s);//不放//放皇后需要不冲突if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[x-y+n]){g[x][y]='Q';row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;dfs(x,y+1,s+1);//放皇后s+1\row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;g[x][y]='.';}}public static void main(String[] args){Scanner scan = new Scanner(System.in);n = scan.nextInt();for(int i=0;i<n;i++){for(int j=0;j<n;j++)g[i][j]='.';}dfs(0,0,0);//x,y,皇后}
}
http://www.dtcms.com/a/601678.html

相关文章:

  • 3.2 自注意力与多头注意力:并行计算不同特征的秘密武器
  • 宁夏建设教育协会网站如何建立公司邮箱
  • 基于昇腾 配置pytorch环境
  • 武威做网站品牌平价网站建设
  • SpringBoot19-@Qualifier用法
  • 工程公司的会计做账有哪些科目官网seo怎么做
  • C语言:一种编译器?| 深入探讨C语言编译器的工作原理与发展
  • SpringBoot+Vue智慧诊所管理系统
  • 企业网站建设价钱专业的家居行业网站开发
  • 解决Idea 插件Plantuml4idea找不到dot的问题
  • 杭州英文网站建设网站建设项目考察范文
  • 济南建设工程信息网站手机刷网站排名软件
  • docker搭建Elasticsearch+Kafka+Logstash+Filebeat日志分析系统
  • Linux离线安装Python环境
  • d47:Elasticsearch入门
  • 李宏毅机器学习笔记
  • 惠州专业网站制作公司wordpress 图片 本地
  • 毕业设计如何用dw做网站wordpress移动顶部导航菜单
  • 安科瑞Acrel-2000MG 储能能量管理系统是什么?什么场景需要用到?
  • 政策加码:中小学人工智能教育新图景
  • 全域释放活力,增长质效兼收——2025年“双11”大促第一周期观察
  • 上海华东建设发展设计有限公司网站网址域名ip
  • 平邑网站制作在线做头像的网站有哪些
  • 沈阳工务建设集团网站淘客cms建站系统
  • 深度学习_神经网络中最常用的学习率优化算法
  • INT301 Bio-computation 生物计算(神经网络)Pt.7 时间序列预测和Elman网络
  • 为什么“随机变量”是个函数?为什么“函数相加”会产生高斯分布?
  • 基于 Tuya.AI 开源的大模型构建智能聊天机器人
  • dw怎么切片做网站宁波正规网站建设使用方法
  • 软件网站建设基本流程哈尔滨建筑专业网站