判断网站到期,自建英文网站,湖南省交通建设质量安全监督管理局网站,网站建设色反射计数 华为OD机考 - 华为OD上机考试 200分题型 华为OD机考真题目录点击查看: 华为OD机考真题题库目录#xff5c;机考题库 算法考点详解
题目描述
给定一个包含 0 和 1 的二维矩阵。
给定一个初始位置和速度#xff0c;一个物体从给定的初始位置出发#xff0c;在给…反射计数华为OD机考 - 华为OD上机考试 200分题型华为OD机考真题目录点击查看: 华为OD机考真题题库目录机考题库 算法考点详解题目描述给定一个包含 0 和 1 的二维矩阵。给定一个初始位置和速度一个物体从给定的初始位置出发在给定的速度下进行移动遇到矩阵的边缘则发生镜面发射。无论物体经过 0 还是 1都不影响其速度。请计算并给出经过 t 时间单位后物体经过 1 点的次数。矩阵以左上角位置为 [0, 0]列(x)行(y)例如下面A点坐标为 [2, 1]第二列第一行注意:如果初始位置的点是 1也计算在内时间的最小单位为 1不考虑小于 1 个时间单位内经过的点输入描述第一行为初始信息w h x y sx sy t第二行开始一共 h 行为二维矩阵信息其中wh 为矩阵的宽和高xy 为起始位置sxsy 为初始速度t 为经过的时间所有输入都是有效的数据范围如下0 w 1000 h 1000 ≤ x w0 ≤ y h-1 ≤ sx ≤ 1-1 ≤ sy ≤ 10 ≤ t 100输出描述经过 1 的个数,注意初始位置也要计算在内.用例1输入12 7 2 1 1 -1 13 001000010000 001000010000 001000010000 001000010000 001000010000 001000010000 001000010000输出3说明初始位置为2,1速度为1,-1那么13个时间单位后经过点1的个数为3题解思路:逻辑分析这道题主要要分析出两个点由样例和图综合可以得出x和y于以往不一样x和y是反的。镜面反射就是当某一个方向触底时值不变方向变为相反。例如当x 0 || x w时设置sx -sx明白这个两个点就通过模拟实现就行当某个方向坐标触底两个边界时对应方向的速度取相反数。然后统计经过合法坐标1的数量就行。按照2的逻辑处理t秒之后输出经过1的数量就行。c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; int main() { int w,h,x,y,sx,sy,t; cin w h x y sx sy t; vectorstring grid(h); for (int i 0; i h; i) { cin grid[i]; } int count 0; while (t 0) { // 由图可知这题x和y是反的因此y其实是行号x是列号 if (grid[y][x] 1) { count; } y sy; x sx; if (x 0) { x 1; sx -sx; } else if (x w) { x w - 2; sx -sx; } if (y 0) { y 1; sy -sy; } else if (y h) { y h -2; sy -sy; } t--; } cout count; return 0; }JAVAimport java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int w sc.nextInt(); int h sc.nextInt(); int x sc.nextInt(); int y sc.nextInt(); int sx sc.nextInt(); int sy sc.nextInt(); int t sc.nextInt(); // 读取地图 String[] grid new String[h]; for (int i 0; i h; i) { grid[i] sc.next(); } int count 0; while (t 0) { // 由题意可知这里 x 和 y 是反的 // y 表示行号x 表示列号 if (grid[y].charAt(x) 1) { count; } y sy; x sx; // 处理 x 方向反弹 if (x 0) { x 1; sx -sx; } else if (x w) { x w - 2; sx -sx; } // 处理 y 方向反弹 if (y 0) { y 1; sy -sy; } else if (y h) { y h - 2; sy -sy; } t--; } System.out.println(count); } }Pythonimportsys# 读取参数w,h,x,y,sx,sy,tmap(int,sys.stdin.readline().split())# 读取地图grid[]for_inrange(h):grid.append(sys.stdin.readline().strip())count0whilet0:# 注意题目中 x 和 y 是反的# y 是行号x 是列号ifgrid[y][x]1:count1ysy xsx# x 方向反弹ifx0:x1sx-sxelifxw:xw-2sx-sx# y 方向反弹ify0:y1sy-syelifyh:yh-2sy-sy t-1print(count)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlines[];rl.on(line,line{lines.push(line.trim());});rl.on(close,(){letidx0;let[w,h,x,y,sx,sy,t]lines[idx].split( ).map(Number);// 读取地图constgrid[];for(leti0;ih;i){grid.push(lines[idx]);}letcount0;while(t0){// 注意y 是行号x 是列号if(grid[y][x]1){count;}ysy;xsx;// x 方向反弹if(x0){x1;sx-sx;}elseif(xw){xw-2;sx-sx;}// y 方向反弹if(y0){y1;sy-sy;}elseif(yh){yh-2;sy-sy;}t--;}console.log(count);});Gopackagemainimport(bufiofmtos)funcmain(){in:bufio.NewReader(os.Stdin)varw,h,x,y,sx,sy,tintfmt.Fscan(in,w,h,x,y,sx,sy,t)// 读取地图grid:make([]string,h)fori:0;ih;i{fmt.Fscan(in,grid[i])}count:0fort0{// 注意y 是行号x 是列号ifgrid[y][x]1{count}ysy xsx// x 方向反弹ifx0{x1sx-sx}elseifxw{xw-2sx-sx}// y 方向反弹ify0{y1sy-sy}elseifyh{yh-2sy-sy}t--}fmt.Println(count)}