深度优先搜索(二)—— n皇后问题、素数环、困难的串

文章目录

    • n皇后问题
    • 素数环
    • 困难的串
    • 问题

n皇后问题

n*n棋盘放n个棋子,要求每行每列每条对角线都只有一个棋子。

import java.util.Scanner;
public class lanqiao1 {
	static int res;
	public static void main(String[] args) {		     
              Scanner scanner = new Scanner(System.in);
              int n = scanner.nextInt();  //n*n棋盘,n个皇后
              int []arr = new int[n];  //下标为行,值为列
              dfs(arr,n,0);
              System.out.println(res);
	}

	private static void dfs(int[] arr,int n ,int row) {
	     if(row == n){
	    	res++;
	    	return;
	     }
	  
	  for(int col=0;col<n;col++){
	    	 boolean ok=true;
	    	   // 检验这个皇后是否和之前已经放置的皇后有冲突
	    for(int i=0;i<row;i++){
	      if(arr[i] == col || arr[i]+i == row + col|| col - row == arr[i]-i){
	        		ok = false;
	        		break;
	        	}
	        }
	          
	    	if(ok){
	    	   arr[row] = col;
	    	   dfs(arr,n,row+1);
	    	   arr[row] = 0; //(此行可有可无)恢复原状,这种解法这里是否恢复状态都行,为啥?
	    	 }
	     }
	}
}

对于对角线,发现了一个规律即:
深度优先搜索(二)—— n皇后问题、素数环、困难的串_第1张图片

素数环

有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

样例输入
6
样例输出
1 4 3 2 5 6
1 6 5 2 3 4

import java.util.Scanner;
public class lanqiao1 {
	public static void main(String[] args) {		     
              Scanner sc = new Scanner(System.in);
              int n = sc.nextInt();  
              int []r = new int[n];  
              r[0] = 1;
              dfs(r,n,1);
   }
	
	private static void dfs(int []r,int n,int cur) {
		//cur为当前下标
		if(cur == n && isP(r[0]+r[n-1])){
			for(int i = 0;i < n;i++){
				System.out.print(r[i]);
				System.out.print(" ");
			}
			System.out.println(); 
			return;
		}
		
	for(int i=2;i<=n;i++){
		if(check(r,i,cur)){//检查这个数和前一个数的和是否为素数&&这个数在数组中是否已出现
				r[cur] = i;
				dfs(r,n,cur+1);
				r[cur] = 0;  //回溯
		}
	  }
	}
	
	private static boolean isP(int num) {
		//判断num是否为素数
		for(int k = 2;k  <= num/2;k++){
			if(num % k ==0)
				return false;
		}
		return true;
	}

	private static boolean check(int[] r, int i, int cur) {
		for(int e:r){
		 if(e==i || !isP(r[cur-1] + i))  return false;
		}
		return true;
	}
}

困难的串

如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串成为“困难的串”。例如:BB,ABCDACABCAB,ABCDABCD都是容易的,而D、DC、ABDAB、CBABCBA都是困难的。
输入正整数n和L,输出由前L个字符(26个大写英文字母)组成的、字典序第n个小的困难的串。例如,当L=3时,前7个困难的串分别为:A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。

import java.util.Scanner;
public class lanqiao1 {
	static int count;
	public static void main(String[] args) {		     
              Scanner sc = new Scanner(System.in);
              int n = sc.nextInt();  
              int L = sc.nextInt(); 
              dfs(L,n,"");
      }

	private static void dfs(int l, int n, String pertix) {
		for(char i ='A';i< 'A'+l;i++){
			if(isHard(pertix,i)){
				String x = pertix+i;
				System.out.println(x);
				count++;
				if(count == n)
					System.exit(0);
			dfs(l,n,x);
			}
		}
	}
    
    //CBABCA i  看i与下标为5的字母是否相同;看A+i与下标为3 4的字母是否相同;
    //看CA+i与下标为1 2 3的字母是否相同;
	private static boolean isHard(String pertix, char i) {
		int count=0;
		for(int j=pertix.length()-1;j>-1;j-=2){
		    String s1 = pertix.substring(j,j+count+1);
		    String s2 = pertix.substring(j+count+1)+i;
		    if(s1.equals(s2))  return false;
		    count++;
		}
		return true; 
	}
}

问题

n皇后问题中
在这里插入图片描述

你可能感兴趣的:(算法)