蓝桥杯训练题1429: [蓝桥杯][2014年第五届真题]兰顿蚂蚁【类似于搜索算法,但是题目已经给了搜索的方法了,只要照着写即可】(比较简单)

题目链接:

https://www.dotcpp.com/oj/problem1429.html

题目描述:

即按照下面的蚂蚁移动规则,输出蚂蚁在指定步数后的位置。

移动规则:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。

然后输入输出的数据说明:

输入:
输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。

输出:
输出数据为一个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。
在这里插入图片描述

思路:

就是按照题目指定的移动规则写就可以了。详情看ac代码咯。

ac代码:

#include <bits/stdc++.h>

using namespace std;

int m,n;
int M[105][105];
//void printM()
//{
//	cout<<"打印的地图"<<endl;
//	for(int i = 0;i < m;i++){
//		for(int j = 0;j < n;j++){
//		cout<<M[i][j];
//	}
//	cout<<endl;}
//}

char changeDir(char c,int a){//c代表当前的方向,a代表当前所处的底面是黑格还是白格 
	if(a==0){
		if(c=='U'){
			return 'L';
		}
		else if(c=='D'){
			return 'R';
		}
		else if(c=='L'){
			return 'D';
		}else{
			return 'U';
		}
	}else{
		if(c=='U'){
			return 'R';
		}else if(c=='D'){
			return 'L';
		}else if(c=='L'){
			return 'U';
		}else{
			return 'D';
		}
	}
}
int changeColor(int a){
	return (a==0)?1:0;
}

int main(){
	


	int start_x,start_y;
	char dir;
	int k;
	int move[4][2] = {{0,-1},{1,0},{0,1},{-1,0}};//左下右上 
	
	cin>>m>>n;
	for(int i = 0;i < m;i++){
		for(int j = 0;j < n;j++){
			cin>>M[i][j];
		}
	}
	cin>>start_x>>start_y>>dir>>k;
	int dx,dy; 
	dx = start_x;
	dy = start_y;
//	int next_x,next;//记录蚂蚁下一步的位置 
	for(int i = 0;i < k;i++){
		dir = changeDir(dir,M[dx][dy]);
		M[dx][dy] = changeColor(M[dx][dy]);
		if(dir == 'U'){
			dx = dx + move[3][0];
			dy = dy + move[3][1];

		}else if(dir == 'D'){
			dx = dx + move[1][0];
			dy = dy + move[1][1];
		}else if(dir == 'L'){
			dx = dx + move[0][0];
			dy = dy + move[0][1];
		}else if(dir == 'R'){
			dx = dx + move[2][0];
			dy = dy + move[2][1];
		}
//		printM();
	}
	
	cout<<dx<<" "<<dy<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值