zoukankan      html  css  js  c++  java
  • 【题解】「UVA10116」Robot Motion

    Simple Translation

    让你模拟一个机器人行走的过程,如果机器人走入了一个循环,输出不是循环的长度和是循环的长度,如果最终走出来了,输出走的步数。

    Solution

    直接模拟即可,本题难度主要是判断循环,但是其实一点也不难。

    首先定义一个 (a) 二维数组,然后将 (a_{0, i}, a_{m+1, i}, a_{i, 0}, a_{i, n+1}) 全部赋值为 (1),这是因为我们可以通过 (a) 数组来判断机器人走没走出地图。

    循环模拟机器人走的每一步,并把走到这个地方所花费的步数记录在 (a_{x, y}),每当发现 (a_{x, y}) 走过时,即 (a_{x, y} eq 0) 时,退出循环。

    当机器人已经走出地图时,输出 (a_{x, y})

    否则,输出未循环的步数和循环的步数,如何算这两个数呢?

    我们发现总共走的步数是记录在 (a_{x, y}) 里面的,而我们走到的下一个格子就是循环的开始,所以只要求一下差值,即可得到。

    Code

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<string>
    #define line cout << endl
    using namespace std;
    int a[13][13];
    char mapp[11][11];
    int m, n;
    int main() {
    	while (cin >> n >> m) {
    		if (m == 0 && n == 0)
    			break;
    		memset (a, 0, sizeof(a));
    		for (int i = 0; i < m + 2; i++) {//将边缘全部变为 1 ,下同
    			a[0][i] = 1;
    			a[m + 1][i] = 1;
    		}
    		for (int i = 0; i < n + 2; i++) {
    			a[i][0] = 1;
    			a[i][n + 1] = 1;
    		}
    		int x = 1, y = 1;//记录当前坐标
    		cin >> x;
    		for (int j = 1; j <= n; j++) {
    			for (int i = 1; i <= m; i++) {
    				cin >> mapp[i][j];
    			}
    		}
    		int xx = x, yy = y;//记录下一个坐标
    		while (!a[xx][yy]) {//如果下一个格子没走过
    			a[xx][yy] = 1 + a[x][y];//记录步数
    			x = xx;//更新坐标
    			y = yy;
    			switch (mapp[xx][yy]) {
    				case 'N':
    					yy--;
    					break;
    				case 'S':
    					yy++;
    					break;
    				case 'W':
    					xx--;
    					break;
    				case 'E':
    					xx++;
    					break;
    			}
    		}
    		if (xx <= 0 || xx > m || yy <= 0 || yy > n) { //如果已经到达边缘
    			cout << a[x][y] << " step(s) to exit" << endl;
    		}
    		else {
    			int s = a[x][y] - (a[x][y] - a[xx][yy] + 1);//求未进如循环的步数
    			cout << s << " step(s) before a loop of " << a[x][y] - a[xx][yy] + 1 << " step(s)" << endl;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Linux用户态程序计时方式详解
    我的代码重构经验
    基于链表的C语言堆内存检测
    C语言内存使用的常见问题及解决之道
    1151 LCA in a Binary Tree (30 分)
    1150 Travelling Salesman Problem (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1148 Werewolf
    1155 Heap Paths (30 分)
    1154 Vertex Coloring (25 分)
  • 原文地址:https://www.cnblogs.com/-TNT-/p/solution-uva10116.html
Copyright © 2011-2022 走看看