目录
一、扫地机器人
此题未解
二、全球变暖
解析:运用dfs
这题其实运用dfs就可以了,唯一注意的点是输入的是字符,读取的时候用char;
dfs:每一次判断该位置的上下左右四个方位是否都是陆地,如果四个都是陆地说明这一块地是不可能被淹没的,换一种说法就是这一块地所在的岛屿不可能被全部淹没,那么判断情况就很明显了,在二维数组的情况下,只需要判断arr[i+1][j],arr[i-11][j],arr[i][j+1],arr[i][j-1]四个位置,而它周围的位置也需要去判断是否相邻,因为相邻说明是同一个岛屿,用dfs搜然后给搜索过的陆地标记就好,代码如下:
代码:
import java.util.Scanner;
public class 全球变暖 {
static int n;//行数
static char[][]arr;//存放每一行的海洋和陆地
static int count=0;//记录剩余岛屿
static boolean[][]visit;//判断是否判断过
static int flag=0;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n=scan.nextInt();//n行
visit=new boolean[n][n];//n*n
arr=new char[n][n];//n*n
for(int i=0;i<n;i++){
arr[i]=scan.next().toCharArray();
}
for(int i=0;i<n;i++){//行循环
for(int j=0;j<n;j++){//列循环
if(arr[i][j]=='#'&& !visit[i][j]){//判断当前陆地是否被进行过判断
flag=0;
dfs(arr,i,j);
if(flag==0)
count++;
}
}
}
System.out.println(count);
scan.close();
}
private static void dfs(char arr[][],int i,int j){
if(arr[i+1][j]=='#'&&arr[i-1][j]=='#'&&arr[i][j+1]=='#'&&arr[i][j-1]=='#'){//判断当前陆地的上下左右各个方向是否都为陆地
flag=1;
}
visit[i][j]=true;//该位置搜索完毕
for(int c=-1;c<2;c++){
for(int b=-1;b<2;b++){
if(c!=0&&b!=0&&b!=c)continue;
if(arr[c+i][j+b]=='#'&& !visit[c + i][j + b]){
dfs(arr,i+c,j+b);
}
}
}
}
}
三、机器人行走
解析:运用字符判断
这题的话,需要简单的判断一下字符和数字
重点1:连续遇到字符要连续转方向,所以 定义数组的时候,要防止它溢出的情况
重点2:题目虽然说数字在0-100之间的整数,但是如果这个值大于10后面又跟一个数字,要进行判断,比如:1002330;那么就是向前走100 向前走23 向前走30,总共向前走153;
重点3:这题每一次都是和开始时的点比较,所以每一条指令后,所有值归零;
代码:
import java.io.*;
import java.util.Arrays;
public class 机器人行走 {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st=new StreamTokenizer(br);
public static void main(String[] args) throws Exception{
int n=nextInt();
String s;
double []arr=new double[4];
int k,t;
for (int i=0;i<n;i++){
Arrays.fill(arr,0);
k=0;
s=nextLine();
t=0;
for (int j=0;j<s.length();j++){
if (s.charAt(j)=='L'){
arr[k]+=t;
t=0;
k--;
}else if (s.charAt(j)=='R'){
arr[k]+=t;
t=0;
k++;
}else if (s.charAt(j)>='0'&&s.charAt(j)<='9'){
if(t>10){
arr[k]+=t;
t=0;
}
t*=10;
t+=s.charAt(j)-'0';
}
if (k<0)
k=3;
else if (k>=4)
k=0;
}
arr[k]+=t;
System.out.println(String.format("%.2f",Math.sqrt(Math.abs(arr[0]-arr[2])*Math.abs(arr[0]-arr[2])+Math.abs(arr[1]-arr[3])*Math.abs(arr[1]-arr[3]))));
}
}
static String nextLine() throws Exception{
return br.readLine();
}
static int nextInt() throws Exception{
st.nextToken();
return (int) st.nval;
}
}
四、数的幂次
解析:运用快速幂
这题运用到快速幂的知识,而快速幂又运用了位运算,所以不会的小伙伴可以去搜一下详细的讲解,毕竟小怂也是刚学的快速幂(小声bb:做题后十分钟,去搜索了快速幂);
代码:
import java.io.*;
public class 数的幂次 {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st=new StreamTokenizer(br);
public static void main(String[] args) throws Exception {
long n=nextLong();
long a,b,p;
for (int i=0;i<n;i++){
a=nextLong();
b=nextLong();
p=nextLong();
System.out.println(pow(a,b,p));
}
}
public static int nextLong() throws Exception{
st.nextToken();
return (int)st.nval;
}
public static long pow(long a,long b,long p){
long ans=1;
while (b>0){
if ((b&1)==1){
ans=ans*a%p;
}
a=a*a%p;
b=b>>1;
}
return ans;
}
}