初识JAVA---常用算法 穷举(遍试,枚举)、迭代、递归、回溯(8)

水仙花数   完全数   相亲数
public class shuixianhua
{
    public static void main(String args[]) {
        for(int a=1;a<=9;a++) {
            for(int b=0;b<=9;b++)
                for(int c=0;c<=9;c++) 
                    if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
                        System.out.println(100*a+10*b+c);
        }
    }
}

class wanquanshu{
    public static void main(String[] args) {
        for(int n=1;n<9999;n++)
            if(n==divsum(n)) System.out.println(n);
    }
    public static int divsum(int n) {
        int s=0;
        for(int i=1;i<n;i++)
            if(n%i==0)s+=i;
        return s;
    }
}

class xiang//你的约数加起来等我与  我的加起来等于你
{
    public static void main(String[] args) {
        for(int n=1;n<=9999;n++) {
            int s=divsun(n);
            if(n>s && divsun(s)==n)
                System.out.println(n+","+s);
        }
    }

    private static int divsun(int n) {
        int s=0;
        for(int i=1;i<n;i++)
            if(n%i==0) s+=i;
        return s;// TODO Auto-generated method stub
    }
}

迭代就是用公式一次次逼近  

递归  画一个树

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CayleyTree extends JFrame{
	public static void main(String []args) {
		CayleyTree frm=new CayleyTree("CayleyTree");
		frm.setVisible(true);
		SwingUtilities.invokeLater(()->{
			frm.init();
			frm.drawTree(10,200,400,100,-Math.PI/2);
		});
	}
	private Frame frm;//带有标题和边框的顶级窗口
	private Graphics graphics;//图形类
	private int width;
	private int height;
	private final double PI=Math.PI;
	private final double th1=30*PI/180;
	private final double th2=20*PI/180;
	private final double per1=0.6;
	private final double per2=0.7;
	
	public CayleyTree(String title) {
		super(title);
		setSize(400,440);
		setBackground(Color.lightGray);
		//setDefaultCloseOperation(EXIT_ON_CLOSE);//注释掉移动的时候就不会关闭了
	}
	
	public void init() {
		width=getSize().width;
		height=getSize().height;
		graphics=this.getGraphics();
		
	}
	
	void drawTree(int n,double x0,double y0,double leng,double th) {
		if(n==0)return;
		double x1=x0+leng*Math.cos(th);
		double y1=y0+leng*Math.sin(th);
		
		drawLine(x0,y0,x1,y1);
		
		drawTree(n-1,x1,y1,per1*leng,th+th1);
		drawTree(n-1,x1,y1,per2*leng,th-th2);
		
	}
	
	void drawLine(double x0,double y0,double x1,double y1) {
		graphics.drawLine((int)x0,(int)y0,(int)x1,(int)y1);
	} 
	
}

回溯,八皇后问题

选择某一可能的线索进行试探,每一步试探都有多种方式,将每一方式都一一试探,如果不符合条件就返回纠正,反复进行这种试探再返回纠正,直到得出全部符合条件的答案或是问题无解

回溯法的基本模式  x++  if  x--

public class EightQueen {
    private int[] resultRange;
    private int rangeNum=0;
    public EightQueen(int num)
    {
        this.resultRange=new int[num];
    }
     
    public static void main(String[] args)
    {
        long startMillis=System.currentTimeMillis();
         
        EightQueen eQueen=new EightQueen(8);
        eQueen.rangeQueen(0);
         
        long endMillis=System.currentTimeMillis();
         
        System.out.println("共"+eQueen.rangeNum+"种方案");
        System.out.println("共消耗时间:"+(endMillis-startMillis));  
    }
     
    //回溯法-----放置皇后
    private void rangeQueen(int num) {
        if(num>=resultRange.length)
        {
            printResult();
            rangeNum++;
            return;
        }
         
        for(int i=0;i<resultRange.length;i++)
        {
            resultRange[num]=i;
            if(checkQueen(num))
            {
                rangeQueen(num+1);//迭代求解
            }
        }
    }
 
    //检查是否存在同列或同斜线的皇后
    private boolean checkQueen(int n) {
        // TODO Auto-generated method stub
        for(int i=0;i<n;i++)
        {
            if(resultRange[n]==resultRange[i] || Math.abs(n-i)==Math.abs(resultRange[n]-resultRange[i]))
            {
                return false;
            }
             
        }
        return true;
    }
     
    //打印出每一种方案以及最终的方案数
    private void printResult() {
         
        System.out.println("第"+(rangeNum+1)+"种方案");
        for(int i=0;i<resultRange.length;i++)
        {
             
            for(int j=0;j<resultRange.length;j++)
            {
                if(j==resultRange[i])
                {
                    System.out.print("*  ");                   
                }
                else {
                    System.out.print(0+"  ");
                }
            }      
            System.out.println();
        }
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }  
}

发布了103 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39653453/article/details/103645807