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)
    }
    


     

  • 相关阅读:
    托付和事件的使用
    在使用supervisord 管理tomcat时遇到的小问题
    无法安装vmware tools的解决方PLEASE WAIT! VMware Tools is currently being installed on your system. Dependin
    (转)Openlayers 2.X加载高德地图
    (转)openlayers实现在线编辑
    (转) Arcgis for js加载百度地图
    (转)Arcgis for js加载天地图
    (转) 基于Arcgis for Js的web GIS数据在线采集简介
    (转) Arcgis for js之WKT和GEOMETRY的相互转换
    (转)Arcgis for Js之Graphiclayer扩展详解
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3091676.html
Copyright © 2011-2022 走看看