| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1351 人关注过本帖
标题:求指点。一道题目想不到思路,感觉直接做好复杂。
只看楼主 加入收藏
RKNO
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2018-9-7
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:4 
求指点。一道题目想不到思路,感觉直接做好复杂。
题目是这样的:
一个正方体盒子上有一只蚂蚁。每一秒蚂蚁会爬过一个面,而且它只会向前走,不会转弯,每一秒的同时我们也会将盒子朝任意方向转动90 度。
为了方便,我们对六个面分别定义为:
正面(面向我们),
背面(正面的反面),
左面(正面左方),
右面(正面右方),
顶面(正面上方),
底(正面下方)

同时,6 个转动方向如下:
正面向左(即转动之后原先的正面变成了左面,其他依次类推)、
正面向右、
正面向上、
正面向下、
正面顺时针(类似于魔方整体顺时针旋转)、
正面逆时针。

开始时,蚂蚁处在0 时刻的正面,且头朝上。
图片附件: 游客没有浏览图片的权限,请 登录注册

现给出转动次序,求蚂蚁出现在盒子的顶的次数。


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

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

输入样例
1
1
5
5 2 3 6 1

输出样例
1
2

Hint:第二组测试数据,在3、4 秒的时候蚂蚁在顶。
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 输入 测试 数据 表示 输出 
2018-11-09 19:41
复旦
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:81
专家分:124
注 册:2018-10-29
收藏
得分:1 
让我想想。
2018-11-12 02:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:19 
程序代码:
    /*
    原始正面 0
    原始背面 5
    原始顶面 1
    原始底面 4
    原始左面 2
    原始右面 3
    */

#include <stdio.h>

inline void cube_next( unsigned 当前正面, unsigned 当前顶面, unsigned 当前左面, unsigned 转动方向, unsigned& 下一正面, unsigned& 下一顶面, unsigned& 下一左面 )
{
    switch( 转动方向 )
    {
    case 1: 下一正面=5-当前左面; 下一顶面=当前顶面; 下一左面=当前正面; break; // 正面向左
    case 2: 下一正面=当前左面; 下一顶面=当前顶面; 下一左面=5-当前正面; break; // 正面向右
    case 3: 下一正面=5-当前顶面; 下一顶面=当前正面; 下一左面=当前左面; break; // 正面向上
    case 4: 下一正面=当前顶面; 下一顶面=5-当前正面; 下一左面=当前左面; break; // 正面向下
    case 5: 下一正面=当前正面; 下一顶面=当前左面; 下一左面=5-当前顶面; break; // 正面顺时针
    case 6: 下一正面=当前正面; 下一顶面=5-当前左面; 下一左面=当前顶面; break; // 正面逆时针
    }
}

int main( void )
{
    for( unsigned n; scanf("%u",&n)==1; )
    {
        unsigned a=0, b=1, c=2; // 魔方的 正面、顶面、左面
        const unsigned ant[] = { 1, 5, 4, 0 }; // 蚂蚁在 1, 5, 4, 0 面上依次运动
        unsigned count = 0;

        for( unsigned i=0; i!=n; ++i )
        {
            unsigned action;
            scanf( "%u", &action );

            cube_next( a,b,c, action, a,b,c );
            if( b == ant[i%4] )
                ++count;
        }

        printf( "> %u\n", count );
    }
}
2018-11-12 10:56
RKNO
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2018-9-7
收藏
得分:0 
回复 3楼 rjsp
谢谢指点,原来还能这样处理,受教了!!学到了很多
2018-11-12 19:17
RKNO
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2018-9-7
收藏
得分:0 
回复 二楼
谢谢啦,上面的高手已经写得很清楚了。

[此贴子已经被作者于2018-11-12 19:22编辑过]

2018-11-12 19:21
快速回复:求指点。一道题目想不到思路,感觉直接做好复杂。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016882 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved