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


     

  • 相关阅读:
    VMWare磁盘配置的问题终于解决了!!
    十种老板不可追随
    关于ASP无组件上传在2003下出错
    设计模式的有趣解释-追MM[转]
    "未能在给定的程序集中找到任何适合于指定的区域性(或非特定区域性)的资源"解决办法
    今天看到了DNN3.0.4,感觉挺不错的,确实有很大的改进!!!
    今天加入了博客园
    一个女孩写的经典程序!!! (转载)
    加了强名后经常出现错误“程序集清单定义与程序集引用不匹配”
    C#写一个URL编码转换GB23121的方法,然后可以取到天气预报
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3091676.html
Copyright © 2011-2022 走看看