2022-6-4 真题练习

MT2 棋子翻转
 中等  通过率:69.45%  时间限制:1秒  空间限制:256M
知识点数组模拟

描述

在 4x4 的棋盘上摆满了黑白棋子,黑白两色棋子的位置和数目随机,其中0代表白色,1代表黑色;左上角坐标为 (1,1) ,右下角坐标为 (4,4) 。
现在依次有一些翻转操作,要对以给定翻转坐标(x,y)(也即第x行第y列)为中心的上下左右四个棋子的颜色进行翻转。
给定两个数组 A 和 f ,分别代表 初始棋盘 和 哪些要进行翻转的位置(x,y) ,请返回经过所有翻转操作后的棋盘。
 
例如输入[[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]]时,初始键盘如下图所示:
 1 import java.util.*;
 2 
 3 
 4 public class Solution {
 5     /**
 6      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 7      *
 8      * 
 9      * @param A int整型二维数组 
10      * @param f int整型二维数组 
11      * @return int整型二维数组
12      */
13     int[][] dir={{0,1},{0,-1},{1,0},{-1,0}};
14     public int[][] flipChess (int[][] A, int[][] f) {
15         // write code here
16         for(int i=0;i<f.length;i++){
17             int x=f[i][0]-1;
18             int y=f[i][1]-1;
19             change(A,x,y);
20         }
21         return A;
22     }
23     
24     public void change(int[][] nums,int x,int y){
25         int m=nums.length,n=nums[0].length;
26         for (int i=0;i<dir.length;i++){
27             int dx=x+dir[i][0];
28             int dy=y+dir[i][1];
29             if (dx>=0&&dy>=0&&dx<m&&dy<n){
30                 nums[dx][dy]=Math.abs(1-nums[dx][dy]);
31             }
32         }
33     }
34 }

思路:根据题目要求直接模拟即可。

 

MT3 拜访
中等  通过率:50.34%  时间限制:1秒  空间限制:256M

描述

现在有一个城市销售经理,需要从公司出发,去拜访市内的某位商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他每次移动只能在左右中选择一个方向 或 在上下中选择一个方向,现在问他有多少种最短方案到达商家地址。

给定一个地图 CityMap 及它的 行长度 n 和 列长度 m ,其中1代表经理位置, 2 代表商家位置, -1 代表不能经过的地区, 0 代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于 10。
注意:需保证所有方案的距离都是最短的方案
 
数据范围:2 \leq n,m \leq 102n,m10
 1 import java.util.*;
 2 
 3 
 4 public class Solution {
 5     /**
 6      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 7      *
 8      * 
 9      * @param CityMap int整型二维数组 
10      * @param n int整型 
11      * @param m int整型 
12      * @return int整型
13      */
14     int[][] dir={{-1,0},{1,0},{0,1},{0,-1}};
15     public int countPath (int[][] CityMap, int n, int m) {
16         // write code here
17         int sx=0,sy=0,ex=0,ey=0;
18         for (int i=0;i<n;i++){
19             for (int j=0;j<m;j++){
20                 if (CityMap[i][j]==2){
21                     sx=i;
22                     sy=j;
23                 }
24                 if (CityMap[i][j]==1){
25                     ex=i;
26                     ey=j;
27                 }
28             }
29         }
30         Queue<int[]> queue=new LinkedList<>();
31         int ans=0;
32         queue.offer(new int[]{sx,sy});
33         while (!queue.isEmpty()){
34             int size=queue.size();
35             if (ans!=0) break;
36             for (int i=0;i<size;i++){
37                 int[] temp=queue.poll();
38                 if (temp[0]==ex&&temp[1]==ey) ans++;
39                 for (int j=0;j<dir.length;j++){
40                     int dx=temp[0]+dir[j][0];
41                     int dy=temp[1]+dir[j][1];
42                     if (dx>=0&&dy>=0&&dx<n&&dy<m&&CityMap[dx][dy]!=-1){
43                         queue.offer(new int[]{dx,dy});
44                     }
45                 }
46             }
47         }
48         return ans;
49     }
50 }

思路:BFS,每次进队的都是相同步数的可能位置,当出现终点时,说明出现了最短步数,统计这一层所有的方案。

posted on 2022-06-04 12:29  阿ming  阅读(41)  评论(0编辑  收藏  举报

导航