SCAU 8631 盒子上的蚂蚁

8631 盒子上的蚂蚁

时间限制:500MS  内存限制:1000K 提交次数:0 通过次数:0

题型: 编程题   语言: 无限制

Description

2009 年国际ACM 程序设计大赛在中国的最后一场regional于11月8日结束,随着在这场比赛中
获得的一枚金牌,SCAU以两金两银的成绩,结束了09年的所有赛事。大家就回到正常的上课时间了。
生活总是十分枯燥的,特别是比赛刚结束的时候,因为空出了很多平常训练的时间,而又想好好放松
一下。所以,suno去玩dota去了,kicd去玩波斯王子去了,zayhero准备去hk的论文,zjx20去玩机
械迷城,livingroom看他的动漫去了,Arokenda去玩KOF去了,ipc和bm 也各玩各的去了......还有
dragon123、pkkj、ick2 三个人正在抓紧时间尽情忽悠,完了之后就要开始地狱式的训练,准备World Final
去了。
    总之,大家都玩去了,就剩下lyd 一个人很无聊不知道干啥。。。
    接着他看到桌子上有只蚂蚁,就抓来玩,好吧有够无聊的。。。
Lyd 把那只可怜的蚂蚁放在一个正方体的盒子上,然后让它不断地在盒子上面爬-_-!!!
在蚂蚁爬的时候,Lyd 还不停的转动盒子,然后他想知道在转动的过程中,蚂蚁会有多少次出现在盒子的顶部。
每一秒蚂蚁会爬过一个面,而且它只会向前走,不会转弯,每一秒的同时Lyd 也会将盒子朝任意方向转动90 度。
为了方便,我们对六个面分别定义为正面(面向Lyd),背面(正面的反面),左面(正面左方),右面
(正面右方),顶(正面上方)和底(正面下方),并特指某整数时刻。而蚂蚁处在0 时刻的正面,且头朝
上。

同时,6 个转动方向如下:
正面向左(即转动之后原先的正面变成了左面,其他依次类推)、正面向右、正面向上、正面向下、
正面顺时针(绕正面的法线顺时针转)、正面逆时针。
    现给出Lyd 的转动次序,求蚂蚁出现在盒子的顶的次数。


Hint
第二个Sample转动如下:

在3、4 秒的时候蚂蚁在顶。

Input

有多组测试数据(2000 组左右),每组测试数据有两行
第一行是lyd 的转动次数n(1<=n<=1000)。
第二行有n 个数,第i 个数表示第i 个动作。1 到6 分别表示正面向左、正面向右、正面向上、正面
向下、正面顺时针、正面逆时针。
数据读入以文件结束符结束。即输入输出类似如下(当然变量名啥的不必一样,VC下按ctrl+z 然后
回车可结束程序):
while(scanf("%d",&n)!=EOF)
{
    for(i=1;i<=n;i++)
    scanf("%d",&act[i]);
    ……
    ……
    printf("%d\n",answer);
}

Output

对于每组测试数据,只输出一行,每行一个数,表示蚂蚁出现在顶多少次。

Sample Input

1
1
5
5 2 3 6 1

Sample Output

1
2

Hint


Source

lyd

Provider

admin

 

#include<stdio.h>
#include<string.h>

void Traverse(int *temp, int *result, int act)
{
    switch(act)
    {
        case 1: result[0] = temp[1];
                result[1] = temp[2];
                result[2] = temp[3];
                result[3] = temp[0]; break;
     
       case 2:  result[0] = temp[3];
                result[3] = temp[2];
                result[2] = temp[1];
                result[1] = temp[0]; break;
       
       case 3:  result[0] = temp[5];
                result[5] = temp[2];
                result[2] = temp[4];
                result[4] = temp[0]; break;
                
       case 4:  result[0] = temp[4];
                result[4] = temp[2];
                result[2] = temp[5];
                result[5] = temp[0]; break;
                
       case 5:  result[1] = temp[4];
                result[4] = temp[3];
                result[3] = temp[5];
                result[5] = temp[1]; break;
                
       case 6:  result[1] = temp[5];
                result[5] = temp[3];
                result[3] = temp[4];
                result[4] = temp[1]; break;
                
       default: return;
  
    }
    return;
}

int main()
{
    int temp[6], result[6], roat[4];
    int i, j, count, T, act;
    roat[0] = 1; roat[1] = 5; roat[2] = 3; roat[3] = 6;
    
    while(scanf("%d",&T) != EOF)
    {
        for(i=0; i<6; ++i) result[i] = temp[i] = i+1;
        count = 0;
        for(i=1; i<=T; ++i)
        {
            scanf("%d", &act);
            Traverse(temp, result, act);
            for(j=0; j<6; ++j) temp[j] = result[j];
            if(roat[i%4] == result[4]) count++;
        }
        printf("%d\n", count);
    }
    return 0;
}

解题报告:

  

原文地址:https://www.cnblogs.com/liaoguifa/p/2776921.html