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; }
解题报告:
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)
作者:雪影蓝枫
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。