zoukankan      html  css  js  c++  java
  • 九宫格问题(回溯法,Go语言实现)

    九宫格问题(回溯法,Go语言实现)

    问题重现:

    有1~10十个数,填入9个数到九宫格,现要求相邻(上下、左右)的两数之和为质数,问有多少种填法?

    此题比较简单,所以直接给代码了。

    解法一

    package main
    
    import (
    	"fmt"
    )
    
    var pos [9]int
    var sub []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    var num []int = []int{1, 2, 3, 5, 7, 11, 13, 17, 19}
    
    /*从质数中查找,找到返回true*/
    func searchFromNum(n int) bool {
    	for i := 0; i < 9; i++ {
    		if n == num[i] {
    			return true
    		}
    	}
    	return false
    }
    
    /*检验结果是否正确*/
    func check(i, n int) bool {
    	//纵向
    	if i-3 >= 0 {
    		if searchFromNum(pos[i]+pos[i-3]) == false {
    			return false
    		}
    	}
    	//横向
    	if i%3 != 0 {
    		if searchFromNum(pos[i]+pos[i-1]) == false {
    			return false
    		}
    	}
    	return true
    }
    
    var down, up int = 0, 9
    
    /*填入1~10到九宫格的解,回溯法*/
    func fillBox(i, n, r int, count *int) {
    	if i == n {
    		(*count)++
    		for i := 0; i < r; i++ {
    			for j := 0; j < r; j++ {
    				fmt.Printf("%3d", pos[i*r+j])
    			}
    			fmt.Println()
    		}
    		fmt.Println("============")
    		return
    	}
    	for j := down; j <= up; j++ {
    		//先放入
    		pos[i] = sub[j]
    		if sub[j] != -1 && check(i, n) {
    			sub[j] = -1
    			fillBox(i+1, n, r, count)
    			sub[j] = pos[i]
    		}
    
    	}
    }
    
    func main() {
    	count := 0
    	fillBox(0, 9, 3, &count)
    	fmt.Println(count)
    }
    

    解法二

    package main
    
    import (
    	"fmt"
    )
    
    var pos [9]int
    var sub []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    var num []int = []int{1, 2, 3, 5, 7, 11, 13, 17, 19}
    
    /*从质数中查找,找到返回true*/
    func searchFromNum(n int) bool {
    	for i := 0; i < 9; i++ {
    		if n == num[i] {
    			return true
    		}
    	}
    	return false
    }
    
    /*检验结果是否正确*/
    func check(n int) bool {
    	//行相邻
    	for i := 0; i < n; i++ {
    		for j := 0; j < n-1; j++ {
    			if searchFromNum(pos[i*n+j]+pos[i*n+j+1]) == false {
    				return false
    			}
    		}
    	}
    	//列相邻
    	for j := 0; j < n; j++ {
    		for i := 0; i < n-1; i++ {
    			if searchFromNum(pos[i*n+j]+pos[(i+1)*n+j]) == false {
    				return false
    			}
    		}
    	}
    	return true
    }
    
    var down, up int = 0, 9
    
    /*填入0~8到九宫格的解,全排列(枚举)*/
    func fillBox(i, n, r int, count *int) {
    	if i == n {
    		if check(r) {
    			(*count)++
    			for i := 0; i < r; i++ {
    				for j := 0; j < r; j++ {
    					fmt.Printf("%3d", pos[i*r+j])
    				}
    				fmt.Println()
    			}
    			fmt.Println("============")
    		}
    		return
    	}
    	for j := down; j <= up; j++ {
    		if sub[j] != -1 {
    			pos[i] = sub[j]
    			sub[j] = -1
    			fillBox(i+1, n, r, count)
    			sub[j] = pos[i]
    		}
    
    	}
    }
    
    func main() {
    	count := 0
    	fillBox(0, 9, 3, &count)
    	fmt.Println(count)
    }
    


     

  • 相关阅读:
    软件需求与建模 复习笔记
    Autoware 笔记No.9,SSD车辆、行人(障碍物)识别(ssd vision detect)
    Autoware 笔记No.8 ENet 障碍物识别(vision segment ENet detect)
    Autoware 1.14 完整安装
    Autoware 笔记No.7, CNN障碍物检测(CNN LiDAR Baidu Object Segmenter)
    iOS 使用局部block处理接口依次调用需求
    阿里一面凉经
    Codeforces round #717 D.Cut(m询问求区间[L,R]能被至少分成多少个区间让每个小区间各数的乘积==各数的LCM)
    2018-2020 国家集训队论文选读
    GDOI 2021 游记
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3091676.html
Copyright © 2011-2022 走看看