专栏文章

题解:AT_gw2015_b アリ巣

AT_gw2015_b题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqnesg0
此快照首次捕获于
2025/12/04 07:38
3 个月前
此快照最后确认于
2025/12/04 07:38
3 个月前
查看原文

AT_gw2015_bアリ巣 题解

题目翻译:在一个无限大小网格上有一只蚂蚁,蚂蚁从给定了一个网格上有一只蚂蚁,蚂蚁从网格的原点 (0,0)(0, 0) 位置出发,按照特定的规则行走。网格的每个位置可以用二进制的状态表示:00 表示白色,11 表示黑色。蚂蚁重复 NN 次以下操作:
  • 如果当前位置是 00,则右转 9090 度,当前位置变成 11
  • 如果当前位置是 11,则左转 9090 度,当前位置变成 00
进行完以上操作后,蚂蚁会先前走一步,求蚂蚁走完 NN 步后当前位置的值。
思路:直接模拟,用 while 模拟每一步的过程,具体模拟过程代码里已经很清晰了,但还是提醒 NN 小等于 10101818 次方,要开long long,初始方向 tt 需要等于 00
CPP
#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	//n表示操作次数 
	cin>>n; 
	long long a[4]={0,1,0,-1},b[4]={1,0,-1,0},x=1000,y=1000,t=0,m[2005][2005]; 
	//a和b用来表示方向
	//x,y为坐标
	//t维护方向
	//m存储网格 
	if(n>=10000) n=10000+(n-10000)%104;
	while(n--){//执行N次,代表操作次数 
		if(m[x][y]==0) t=(t+1)%4;//当所处为白色时,右转。 
		else{//当所处为黑色时; 
			if(t==0) t=4;//当他是0时无法左转(-1),所以要特判 
			t=(t-1)%4; //左转 
		}
		m[x][y]=!m[x][y];//翻转数字 
		x+=b[t];//向前走 
		y+=a[t];//往前一步 
	}
	cout<<m[x][y]<<endl;//输出结果 
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...