算法java實現--回溯法--符號三角形問題

符號三角形問題的java實現(回溯法)

具體問題描述以及C/C++實現參見網址

http://blog.csdn.net/liufeng_king/article/details/8764319

/**
 * 符號三角形問題
 * @author Lican
 *
 */
public class Triangles {
	public int n;//第一行的符號個數
	public int half;//n*(n+1)/4
	public int count;//當前+的個數
	public int[][] p;//符號三角形矩陣
	public long sum;//已找到的符號三角形個數
	public long compute(int nn){
		n=nn;
		count=0;
		sum=0;
		half=n*(n+1)/2;
		if(half%2==1) return 0;
		half=half/2;
		p=new int[n+1][n+1];
		backtrack(1);
		return sum;
	}
	public void backtrack(int t){
		if(count>half||(t*(t-1)/2-count)>half)
			return ;
		if(t>n)
			sum++;
		else{
			for(int i=0;i<2;i++){
				p[1][t]=i;
				count+=i;
				for(int j=2;j<=t;j++){
					p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];//^:按位異或。比如二進制     1001 ^ 1100 = 0101  0^0=0,1^1=0 ,1^0 = 1,0^1=1。
                    count+=p[j][t-j+1];
				}
				backtrack(t+1);
				for(int j=2;j<=t;j++){
					count-=p[j][t-j+1];
					
				}
				count-=i;
			}
		}
	}
	public static void main(String[] args) {
		Triangles t=new Triangles();
		long sum=t.compute(7);
		System.out.println("n="+t.n+"時,有"+sum+"個符號三角形");
	}
}
/**
輸出結果:

n=7時,有12個符號三角形
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章