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,其他的做的还是比较少,日后有机会再补充
感觉也没什么人看 就当笔记使吧
排球真难顶