UVa 556 Amazing

📅 2026/6/21 15:38:06
UVa 556 Amazing
题目描述题目要求模拟一个机器人沿着右墙法则在迷宫中行走。机器人从西南角左下角出发初始方向朝东。机器人保持右侧始终贴着墙壁若前方有墙则向左转直到可以前进。机器人回到起点时停止。统计每个单元格被访问的次数000、111、222、333、444次输出五个数字。输入格式输入包含多个迷宫。每个迷宫的第一行包含两个整数bbb和www行数和列数。接下来bbb行每行www个字符0表示空地1$ 表示墙。输入以0 0 结束。输出格式对于每个迷宫输出一行五个整数分别表示被访问000、111、222、333、444次的单元格数量每个整数右对齐宽度333。样例输入3 5 01010 01010 00000 0 0输出2 3 5 1 0题目分析本题的核心是模拟机器人行走按右墙法则。方向与转向方向东(000)、南(111)、西(222)、北(333)。右转方向d(d3) mod 4d (d 3) \bmod 4d(d3)mod4逆时针909090度。左转方向d(d1) mod 4d (d 1) \bmod 4d(d1)mod4。行走规则尝试前进当前方向。若前方为空地则移动否则左转逆时针重复尝试。移动后检查右侧当前方向右转909090度是否为空地若是则右转即调整方向为右侧方向。边界迷宫四周有墙但输入不包含外边界需要自行处理边界检查。统计记录每个单元格被访问的次数起点在第一次离开时计数注意定义正方形被访问是指机器人进入并离开它。初始位置算访问吗从样例推断初始位置算一次访问。复杂度分析机器人移动步数有限最多访问每个单元格多次直至回到起点。代码实现// Amazing// UVa ID: 556// Verdict: Accepted// Submission Date: 2016-08-18// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intb,w;chargrid[100][100];intcounter[100][100];intoffset[4][2]{{0,1},{1,0},{0,-1},{-1,0}};intrightside[4][2]{{-1,0},{0,1},{1,0},{0,-1}};while(cinbw,b){memset(counter,0,sizeof(counter));for(inti1;ib;i)for(intj1;jw;j)cingrid[b-i1][j];intx1,y1,nextx,nexty,rightx,righty,d0;do{nextxxoffset[d][0],nextyyoffset[d][1];if(nextx1||nextxb||nexty1||nextyw||grid[nextx][nexty]1){d;d%4;}else{counter[nextx][nexty];xnextx,ynexty;rightxnextxrightside[d][0],rightynextyrightside[d][1];if(rightx1rightxbrighty1rightywgrid[rightx][righty]0){d3;d%4;}}}while(x!1||y!1);inttimes[5]{0,0,0,0,0};for(inti1;ib;i)for(intj1;jw;j)if(grid[i][j]0)times[counter[i][j]];for(inti0;i4;i)coutsetw(3)times[i];cout\n;}return0;}