蓝桥杯--递归3

AcWing 116. 飞行员兄弟

原题链接

题意:4x4的+ -符号矩阵中,拨动一个位置将使当前位置为中心的十字直至矩阵边缘的范围,+ -符号调换。给出初始矩阵判断最小步数使矩阵全部为-符号。

还是一题看着感觉和递归关联不大的题,和费解的开关这道题有点类似,可以把这题的矩阵整体看做开关题的第一行,由于数据量不大,可以直接枚举十六个符号的全部情况,同样是使用位运算来简化,将十六位二进制数模拟成4x4矩阵,使用移位和按位与运算来判断需要调动的位置,按题意操作矩阵,最后check即可。由于此题需要保存步骤,可以新建数对类,使用vector储存即可。此类位运算可以参照 递归1


import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.Vector;

public class Main {
    
    
	static Scanner tab = new Scanner(System.in);
	static BufferedWriter tabb = new BufferedWriter(new OutputStreamWriter(System.out));
	static int N = 10;
	
	static char g[][]=new char[5][5],bg[][]=new char[5][5];
	
	static class PII{
    
    
		int x,y;
		public PII(int x,int y) {
    
    
			this.x=x;
			this.y=y;
		}
		public String toString() {
    
    
			return (this.x+1)+" "+(this.y+1);
		}
	}
	
	public static int get(int i,int j) {
    
    
		return 4*i+j;
	}
	
	static void turnall(int x,int y) {
    
    
		for(int i=0;i<4;i++) {
    
    
			turnone(x, i);
			turnone(i, y);
		}
		turnone(x, y);
	}
	
	static void turnone(int i,int j) {
    
    
		if(g[i][j]=='+')
			g[i][j]='-';
		else
			g[i][j]='+';
	}
	
	public static void main(String[] args) throws IOException {
    
    
		for(int i=0;i<4;i++) {
    
    
			String s=tab.next();
			for(int j=0;j<4;j++) {
    
    
				bg[i][j]=s.charAt(j);
			}
		}
		Vector<PII> res=new Vector<PII>();
		for(int op=0;op<1<<16;op++) {
    
    
			Vector<PII> temp=new Vector<PII>();
			//备份复制
			for(int i=0;i<4;i++) {
    
    
				for(int j=0;j<4;j++) {
    
    
					g[i][j]=bg[i][j];
				}
			}
			//操作
			for(int i=0;i<4;i++) {
    
    
				for(int j=0;j<4;j++) {
    
    
					if((op>>get(i,j)&1)==1) {
    
    
						turnall(i,j);
						temp.add(new PII(i,j));
					}
				}
			}
			//check
			boolean flag=true;
			for(int i=0;i<4;i++) {
    
    
				for(int j=0;j<4;j++) {
    
    
					if(g[i][j]=='+') {
    
    
						flag=false;
						break;
					}
				}
			}
			
			if(flag&&res.size()<temp.size()) {
    
    
				res=temp;
			}
		}
		System.out.println(res.size());
		for(int i=0;i<res.size();i++) {
    
    
			System.out.println(res.get(i));
		}
	}
}


AcWing 1208. 翻硬币

原题链接

题意:每次翻转相邻的两枚硬币,求最小步数达到目标状态

比较水,日常没觉得和递归有什么关联==
直接从头遍历,有不同直接翻就行了,而且保证有解,只需要遍历到length-1就可以了


import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.Vector;

public class Main {
    
    
	static Scanner tab = new Scanner(System.in);
	static BufferedWriter tabb = new BufferedWriter(new OutputStreamWriter(System.out));
	static int N = 110;
	
	static char[] bg=new char[N];
	static char[] g=new char[N];

	static void turn(int x) {
    
    
		if(g[x]=='*')
			g[x]='o';
		else
			g[x]='*';
		if(g[x+1]=='*')
			g[x+1]='o';
		else
			g[x+1]='*';
	}
	
	public static void main(String[] args) throws IOException {
    
    
		String s=tab.next();
		for(int i=0;i<s.length();i++) {
    
    
			g[i]=s.charAt(i);
		}
		s=tab.next();
		for(int i=0;i<s.length();i++) {
    
    
			bg[i]=s.charAt(i);
		}
		int t=0;
		for(int i=0;i<g.length-1;i++) {
    
    
			if(g[i]!=bg[i]) {
    
    
				turn(i);
				t++;
			}
		}
		System.out.println(t);
		
		
	}
}


其实acwing的这个递归专题后面几道都是递推系的,不过都归到了一个专题里,递归的经典题型也就之前的几道dfs,其他的做的还是比较少,日后有机会再补充

感觉也没什么人看 就当笔记使吧

排球真难顶

猜你喜欢

转载自blog.csdn.net/ooold_six/article/details/115145673