(Java)递归_N皇后问题、递归_数24、递归_数24、递归_爬楼梯、递归_逆波兰表达式、递归_放苹果、递归_表达式求值、递归_八皇后问题

package 蓝桥杯;

public class VO递归_八皇后问题 {
	static int[] QueenPos=new int[8];//用来存放算好的皇后位置,最左上角是(0,0)
	static int count=0;
	public static void main(String[] args) {
		NQueue(0);//从第0行开始摆放皇后
	}
	static void NQueue(int k) {//在0-k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
		int i;//行数
		if(k==8) {//n个皇后已经摆好
			count++;
			System.out.println("No. "+count);
			for(i=0;i<8;i++) {
				for(int l=0;l<8;l++) {
					if(l==QueenPos[i])
						System.out.print(1+" ");
					else 
						System.out.print(0+" ");
				}
				System.out.println();
			}
			return;
		}
		int j;//数组下标
		for(i=0;i<8;i++) {//逐尝试第k个皇后的位置
			for( j=0;j<k;j++) {
				//和已经摆好的k个皇后的位置比较,看是否冲突
				if(QueenPos[j]==i||Math.abs(QueenPos[j]-i)==Math.abs(k-j)) {
					break;
				}
			}
			if(j==k) {
				QueenPos[k]=i;
				NQueue(k+1);
			}
		}//下一步是for( i=0;i<n;i++)
	}
}


package 蓝桥杯;
import java.util.Scanner;

//2-(1+2)*3-3
public class VO递归_表达式求值 {
	static int count=0;
	static String s=new String();
	public static void main(String[] args) {
		Scanner reader=new Scanner(System.in);
		s=reader.next();
		//System.out.println(s);
		System.out.printf("%.2f",expression_value());
		reader.close();
	}
//(2+3)*(5+7)+9/3
	static double expression_value() {
		
		double result =term_value();
		boolean more =true;
		while(more) {
			char op=s.charAt(count);
			if(op=='+'||op=='-') {
				count++;
				double value=term_value();
				if(op=='+')result+=value;
				else result-=value;
			}
			else more =false;
		}
		return result;
	}
	static double term_value() {
		double result=factor_value();
		while(true) {
			char op=s.charAt(count);
			if(op=='*'||op=='/') {
				count++;
				double value=factor_value();
				if(op=='*')result*=value;
				else result/=value;
			}
			else break;
		}
		return result;
	}
	static double factor_value() {
		double result=0;
		char c=s.charAt(count);
		if(c=='(') {
			count++;
			result=expression_value();
			count++;
		}
		else {
			while(Character.isDigit(c)) {
				result=10*result+c-'0';
				count++;
				c=s.charAt(count);
			}
		}
		return result;
	}
}

package 蓝桥杯;

import java.util.Scanner;
//当k>i   f(i,k)=f(i.i)
//当i<=k   f(i,k)=f(i,k-1)+f(i-k,k)
//边界条件?
public class VO递归_放苹果 {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int t=reader.nextInt();
		while(t>0) {
			int m=reader.nextInt();
			int n=reader.nextInt();
			System.out.println(f(m,n));
			t--;
		}
		reader.close();

	}
	static int f(int m,int n) {
		if(n>m)
			return f(m, m);
		if(m==0)
			return 1;
		if(n==0)
			return 0;
		return f(m, n-1)+f(m-n, n);
	}

}

package 蓝桥杯;

import java.util.Scanner;

//* + 11.0 12.0 + 24.0 35.0
public class VO递归_逆波兰表达式 {
	static String[] k= new String[10];
	static int i=-1;
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		String s=reader.nextLine();
		k=s.split(" ");//把所有输入的当成一个字符串 ,就会以所有的空格拆分得到数组
		System.out.printf("%f\n",exp());
		reader.close();
	}
	static double exp() {
		i++;
		//System.out.println(k[0]);
		switch (k[i].charAt(0)) {
		case '+':
			return exp()+exp();
		case '-':
			return exp()-exp();
		case '*':
			return exp()*exp();
		case '/':
			return exp()/exp();

		default:
			return Double.parseDouble(k[i]);
		}
		
	}

}

package 蓝桥杯;

import java.util.Scanner;

public class VO递归_爬楼梯 {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		while(reader.hasNext()) {
			int n=reader.nextInt();
			System.out.println(stairs(n));
		}
		reader.close();

	}
	//5 8 10//8 34 89
	static int stairs(int n) {
		if(n<0)
			return 0;
		if(n==0)
			return 1;
		return stairs(n-1)+stairs(n-2);
	}

}

package 蓝桥杯;

import java.util.Scanner;

public class VO递归_数24 {
 //n个数算24,必有两个数要先算。这两个数算的结果,和剩余n-2个数,就构成了n-1个数求24的问题。
	//枚举先算的两个数,以及这两个数的运算方式
	//边界条件:一个数算24
	//注意:浮点数比较是否相等,不能用==,小于某个阈值
	static double[] a=new double[5];
	static double EPS=1e-6;
	static boolean isZero(double x) {
		return Math.abs(x)<=EPS;
	}
	static boolean count24(double a[],int n) {
		if(n==1) {
			if(isZero(a[0]-24))
				return true;
			else 
				return false;
		}
		double[] b=new double[5];
		for(int i=0;i<n-1;i++) {
			for(int j=i+1;j<n;j++){//枚举两个数的组合
				int m=0;//还剩下m个数,m=n-2
				for(int k=0;k<n;++k) 
					if(k!=i&&k!=j) 
						b[m++]=a[k];
					b[m]=a[i]+a[j];
					if(count24(b, m+1)) {
						//System.out.print("测试点1");
						return true;
					}
					b[m]=a[i]-a[j];
					if(count24(b, m+1)) {
						//System.out.print("测试点2");
						return true;
					}
					b[m]=a[j]-a[i];
					if(count24(b, m+1)) {
						//System.out.print("测试点3");
						return true;
					}
					b[m]=a[i]*a[j];
					if(count24(b, m+1)) {
						//System.out.print("测试点4");
						return true;
					}
					if(!isZero(a[j])) {
						b[m]=a[i]/a[j];
						if(count24(b, m+1)) {
							//System.out.print("测试点5");
							return true;
						}
					}
					if(!isZero(a[i])) {
						b[m]=a[j]/a[i];
						if(count24(b, m+1)) {
						//	System.out.print("测试点6");
							return true;
						}
					}
				}
			}
		return false;//经验看清楚哪里结束判断,dead code的意思是无效代码,说明逻辑有错
	}
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		a[0]=1;
		while(a[0]!=0) {//结尾是0为结尾的输入以上一次输入没参考
			for(int l=0;l<4;l++) 
				a[l]=reader.nextDouble();
			if(a[0]!=0&&a[1]!=0&&a[2]!=0&&a[3]!=0) {
			if(count24(a, 4))
				System.out.println("YES");
			else System.out.println("NO");
			}
		
		}
	reader.close();
		//测试数据:1 1 1 1 3 2 2 1 2 24 3 9
	}

}

package 蓝桥杯;

import java.util.Scanner;

public class VO递归_数24 {
 //n个数算24,必有两个数要先算。这两个数算的结果,和剩余n-2个数,就构成了n-1个数求24的问题。
	//枚举先算的两个数,以及这两个数的运算方式
	//边界条件:一个数算24
	//注意:浮点数比较是否相等,不能用==,小于某个阈值
	static double[] a=new double[5];
	static double EPS=1e-6;
	static boolean isZero(double x) {
		return Math.abs(x)<=EPS;
	}
	static boolean count24(double a[],int n) {
		if(n==1) {
			if(isZero(a[0]-24))
				return true;
			else 
				return false;
		}
		double[] b=new double[5];
		for(int i=0;i<n-1;i++) {
			for(int j=i+1;j<n;j++){//枚举两个数的组合
				int m=0;//还剩下m个数,m=n-2
				for(int k=0;k<n;++k) 
					if(k!=i&&k!=j) 
						b[m++]=a[k];
					b[m]=a[i]+a[j];
					if(count24(b, m+1)) {
						//System.out.print("测试点1");
						return true;
					}
					b[m]=a[i]-a[j];
					if(count24(b, m+1)) {
						//System.out.print("测试点2");
						return true;
					}
					b[m]=a[j]-a[i];
					if(count24(b, m+1)) {
						//System.out.print("测试点3");
						return true;
					}
					b[m]=a[i]*a[j];
					if(count24(b, m+1)) {
						//System.out.print("测试点4");
						return true;
					}
					if(!isZero(a[j])) {
						b[m]=a[i]/a[j];
						if(count24(b, m+1)) {
							//System.out.print("测试点5");
							return true;
						}
					}
					if(!isZero(a[i])) {
						b[m]=a[j]/a[i];
						if(count24(b, m+1)) {
						//	System.out.print("测试点6");
							return true;
						}
					}
				}
			}
		return false;//经验看清楚哪里结束判断,dead code的意思是无效代码,说明逻辑有错
	}
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		a[0]=1;
		while(a[0]!=0) {//结尾是0为结尾的输入以上一次输入没参考
			for(int l=0;l<4;l++) 
				a[l]=reader.nextDouble();
			if(a[0]!=0&&a[1]!=0&&a[2]!=0&&a[3]!=0) {
			if(count24(a, 4))
				System.out.println("YES");
			else System.out.println("NO");
			}
		
		}
	reader.close();
		//测试数据:1 1 1 1 3 2 2 1 2 24 3 9
	}

}

package 蓝桥杯;

import java.util.Scanner;

public class VO递归_N皇后问题 {
	static int n;
	static int[] QueenPos=new int[100];//用来存放算好的皇后位置,最左上角是(0,0)
	public static void main(String[] args) {
		Scanner reader=new Scanner(System.in);
		n=reader.nextInt();
		NQueue(0);//从第0行开始摆放皇后
		reader.close();
	}
	static void NQueue(int k) {//在0-k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
		int i;//行数
		if(k==n) {//n个皇后已经摆好
			for(i=0;i<n-1;i++) {
				System.out.print(QueenPos[i]+1+" ");
			}
			System.out.print(QueenPos[n-1]+1);
			System.out.println();
			return;
		}
		int j;//数组下标
		for(i=0;i<n;i++) {//逐尝试第k个皇后的位置
			for( j=0;j<k;j++) {
				//和已经摆好的k个皇后的位置比较,看是否冲突
				if(QueenPos[j]==i||Math.abs(QueenPos[j]-i)==Math.abs(k-j)) {
					break;
				}
			}
			if(j==k) {
				QueenPos[k]=i;
				NQueue(k+1);
			}
		}//下一步是for( i=0;i<n;i++)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值