题解:AT_gw2015_b アリ巣

· · 题解

AT_gw2015_bアリ巣 题解

题目翻译:在一个无限大小网格上有一只蚂蚁,蚂蚁从给定了一个网格上有一只蚂蚁,蚂蚁从网格的原点 (0, 0) 位置出发,按照特定的规则行走。网格的每个位置可以用二进制的状态表示:0 表示白色,1 表示黑色。蚂蚁重复 N 次以下操作:

进行完以上操作后,蚂蚁会先前走一步,求蚂蚁走完 N 步后当前位置的值。

思路:直接模拟,用 while 模拟每一步的过程,具体模拟过程代码里已经很清晰了,但还是提醒 N 小等于 1018 次方,要开long long,初始方向 t 需要等于 0

#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;
}