蓝桥杯(3.10)
1219. 移动距离
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int w = sc.nextInt();
int m = sc.nextInt();
int n = sc.nextInt();
m--;
n--;//由从1开始变为从0开始
//求行号
int x1 = m/w, x2 = n/w;
//求列号
int y1 = m%w, y2 = n%w;
if(x1%2 != 0) y1 = w-y1-1;
if(x2%2 != 0) y2 = w-y2-1;
System.out.println(Math.abs(x1-x2)+Math.abs(y1-y2));//曼哈顿距离
}
}
1229. 日期问题
import java.util.Scanner;
public class Main{
static int[] days = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split("/");
for(int i=19600101;i<=20591231;i++) {
int year = i/10000;
int year2 = year%100;
int month = i/100 %100;
int day = i%100;
int s1 = Integer.parseInt(s[0]);
int s2 = Integer.parseInt(s[1]);
int s3 = Integer.parseInt(s[2]);
if((year%100!=0 && year%4 == 0)||(year%400 == 0))
days[2] = 29;
else
days[2] = 28;//注意
boolean f1 = false;
boolean f2 = false;
boolean f3 = false;
//日月相等或者月日相等
if(s1 == s2 && s2 == s3){//12/12/12
f1 = true;
}else if(s1 == s2){12/12/06
f1 = true;
f2 = true;
}else if(s1 == s3){//12/06/12
f1 = true;
f3 = true;
}else{//06/07/12
f1 = true;
f2 = true;
f3 = true;
}//没有s2 == s3 这种的样例
//年月日
if(f1){
if(year2 == s1&&month == s2&&day == s3) {
if((month>=1 && month<=12) && (day>=1 && day<=days[month]))
System.out.printf("%d-%02d-%02d\n",year,month,day);
}
}
//日月年
if(f2){
if(day == s1&&month == s2&&year2 == s3) {
if((month>=1 && month<=12) && (day>=1 && day<=days[month]))
System.out.printf("%d-%02d-%02d\n",year,month,day);
}
}
//月日年
if(f3){
if(month == s1&&day == s2&&year2 == s3) {
if((month>=1 && month<=12) && (day>=1 && day<=days[month]))
System.out.printf("%d-%02d-%02d\n",year,month,day);
}
}
}
}
}
if合并
import java.util.Scanner;
public class Main{
static int[] days = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split("/");
for(int i=19600101;i<=20591231;i++) {
int year = i/10000;
int year2 = year%100;
int month = i/100 %100;
int day = i%100;
int s1 = Integer.parseInt(s[0]);
int s2 = Integer.parseInt(s[1]);
int s3 = Integer.parseInt(s[2]);
if((year%100!=0 && year%4 == 0)||(year%400 == 0))
days[2] = 29;
else
days[2] = 28;//注意
if(year2 == s1&&month == s2&&day == s3
||day == s1&&month == s2&&year2 == s3
||month == s1&&day == s2&&year2 == s3) {
if((month>=1 && month<=12) && (day>=1 && day<=days[month]))
System.out.printf("%d-%02d-%02d\n",year,month,day);
}
}
}
}
1101. 献给阿尔吉侬的花束
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
public class Main{
static int r;
static int c;
static final int N = 210;
static char[][] g = new char[N][N];
static int[][] dis = new int[N][N];
static int[] dx = {1,-1,0,0};
static int[] dy = {0,0,1,-1};
public static int bfs(PII start,PII end) {
Deque<PII> dq = new LinkedList<>();
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
dis[i][j] = -1;
dis[start.x][start.y] = 0;
dq.addLast(start);
while(!dq.isEmpty()) {
PII t = dq.pollFirst();//取出队头元素并且删除
for(int i=0;i<4;i++) {
int x = t.x+dx[i],y = t.y+dy[i];
if(x<0 || x>(r-1) || y<0 || y>(c-1)) continue;
if(g[x][y] == '#') continue;
if(dis[x][y] != -1) continue;
dis[x][y] = dis[t.x][t.y] + 1;
if(end.x == x && end.y == y)
return dis[x][y];
dq.addLast(new PII(x,y));
}
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.nextLine();
while(t-- != 0) {
r = sc.nextInt();
c = sc.nextInt();
sc.nextLine();
for(int i=0;i<r;i++)
g[i] = sc.nextLine().toCharArray();
PII start = null,end = null;
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
if(g[i][j] == 'S')
start = new PII(i,j);
if(g[i][j] == 'E')
end = new PII(i,j);
}
}
int distance = bfs(start,end);
if(distance == -1) System.out.println("oop!");
else System.out.println(distance);
}
}
}
class PII{
int x;
int y;
public PII(int x,int y) {
this.x = x;
this.y = y;
}
}
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
public class Main{
static int r;
static int c;
static final int N = 210;
static char[][] g = new char[N][N];
static int[][] dis = new int[N][N];
static int[] dx = {1,-1,0,0};
static int[] dy = {0,0,1,-1};
public static int bfs(int[] start,int[] end) {
Deque<int[]> dq = new LinkedList<>();
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
dis[i][j] = -1;
dis[start[0]][start[1]] = 0;
dq.addLast(start);
while(!dq.isEmpty()) {
int[] t = dq.pollFirst();//取出队头元素并且删除
for(int i=0;i<4;i++) {
int x = t[0]+dx[i],y = t[1]+dy[i];
if(x<0 || x>(r-1) || y<0 || y>(c-1)) continue;
if(g[x][y] == '#') continue;
if(dis[x][y] != -1) continue;
dis[x][y] = dis[t[0]][t[1]] + 1;
if(end[0] == x && end[1] == y)
return dis[x][y];
dq.addLast(new int[]{x,y});
}
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.nextLine();//
while(t-- != 0) {
r = sc.nextInt();
c = sc.nextInt();
sc.nextLine();//
for(int i=0;i<r;i++)
g[i] = sc.nextLine().toCharArray();
int[] start = new int[2];
int[] end = new int[2];
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
if(g[i][j] == 'S')
start = new int[]{i,j};
if(g[i][j] == 'E')
end = new int[]{i,j};
}
}
int distance = bfs(start,end);
if(distance == -1) System.out.println("oop!");
else System.out.println(distance);
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Deque;
import java.util.LinkedList;
public class Main{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static final int N = 210;
static int r;
static int c;
static int[][] dis = new int[N][N];
static char[][] ch = new char[N][N];
public static int bfs(int[] start,int[] end) {
Deque<int[]> dq = new LinkedList<>();
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
dis[i][j] = -1;
dis[start[0]][start[1]] = 0;
dq.addLast(start);
int[] dx = {1,-1,0,0};
int[] dy = {0,0,1,-1};
while(!dq.isEmpty()) {
int[] t = dq.pollFirst();
for(int i=0;i<4;i++) {
int x = t[0] + dx[i];
int y = t[1] + dy[i];
if(x<0 || x>r-1 || y<0 || y > c-1)
continue;
if(ch[x][y] == '#')
continue;
if(dis[x][y] != -1)
continue;
dis[x][y] = dis[t[0]][t[1]]+1;
if(end[0] == x && end[1] == y)
return dis[x][y];
dq.addLast(new int[]{x,y});
}
}
return -1;
}
public static void main(String[] args) throws IOException{
int n = Integer.parseInt(br.readLine());//测试数据组数
while(n-- != 0) {
String[] s = br.readLine().split(" ");
r = Integer.parseInt(s[0]);
c = Integer.parseInt(s[1]);
for(int i=0;i<r;i++)
ch[i] = br.readLine().toCharArray();
int[] start = new int[2];
int[] end = new int[2];
for(int i=0;i<r;i++)
for(int j=0;j<c;j++) {
if(ch[i][j] == 'S')
start = new int[] {i,j};
if(ch[i][j] == 'E')
end = new int[] {i,j};
}
int distance = bfs(start,end);
if(distance == -1)
System.out.println("oop!");
else
System.out.println(distance);
}
}
}
1224. 交换瓶子
import java.util.*;
public class Main{
static final int N = 10010;
static int[] a = new int[N];
static boolean[] b = new boolean[N];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i=1;i<=n;i++)
a[i] = sc.nextInt();
int sum = 0;
for(int i=1;i<=n;i++){
if(!b[i]){
sum++;
for(int j=i;!b[j];j = a[j])
b[j] = true;
}
}
System.out.println(n - sum);
}
}
1240. 完全二叉树的权值
import java.util.Scanner;
public class Main{
static final int N = 100010;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] res = new int[N];
for(int i=1;i<=n;i++)
res[i] = sc.nextInt();
long max = Long.MIN_VALUE;
int dp = 0;
for(int i=1,d=1;i<=n;d++,i*=2) {
//i表示每一层的第一个位置
//d表示层数
long sum = 0;//
for(int j=i;j<(i+(1<<d-1)) && j<=n;j++)//完全二叉树最后一层可能不满所以要j<=n
sum+=res[j];
if(sum>max) {
max = sum;
dp = d;
}
}
System.out.println(dp);
}
}
1096. 地牢大师
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
public class Main{
static int l;
static int r;
static int c;
static final int N = 110;
static char[][][] ch = new char[N][N][N];
static int[][][] dis = new int[N][N][N];
static int[] dx = {1,-1,0,0,0,0};
static int[] dy = {0,0,1,-1,0,0};
static int[] dz = {0,0,0,0,1,-1};
public static int bfs(int[] start,int[] end) {
Deque<int[]> dq = new LinkedList<>();
for(int i=0;i<l;i++)
for(int j=0;j<r;j++)
for(int k=0;k<c;k++) {
dis[i][j][k] = -1;
}
dis[start[0]][start[1]][start[2]] = 0;
dq.addLast(start);
while(!dq.isEmpty()) {
int[] t = dq.pollFirst();
for(int i=0;i<6;i++) {
int x = t[0]+dx[i];
int y = t[1]+dy[i];
int z = t[2]+dz[i];
if(x<0 || x>l-1 || y<0 || y>r-1 || z<0 || z>c-1)
continue;
if(ch[x][y][z] == '#')
continue;
if(dis[x][y][z] != -1)
continue;
dis[x][y][z] = dis[t[0]][t[1]][t[2]] + 1;
if(end[0] == x && end[1] == y && end[2] == z)
return dis[x][y][z];
dq.addLast(new int[] {x,y,z});
}
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
l = sc.nextInt();
r = sc.nextInt();
c = sc.nextInt();
if(l == 0 && r == 0 && c == 0)
return ;
int[] start = new int[3];
int[] end = new int[3];
for(int i = 0;i < l;i ++)
{
for(int j = 0;j < r;j ++)
{
char[] charArray = sc.next().toCharArray();
for(int k = 0;k < c;k ++)
{
ch[i][j][k] = charArray[k];
if(ch[i][j][k] == 'S') start = new int[] {i,j,k};
if(ch[i][j][k] == 'E') end = new int[] {i,j,k};
}
}
}
int distance = bfs(start,end);
if(distance == -1)
System.out.println("Trapped!");
else
System.out.printf("Escaped in %d minute(s).\n",distance);
}
}
}