【问题标题】:Rolling a dice in a spiral以螺旋方式掷骰子
【发布时间】:2017-02-02 03:03:18
【问题描述】:

给定 nxn 的网格大小,将一个骰子放在左上角的区域 (1,1) 上,数字 6 朝下,5 面向 (1,2),4 面向 (2,1)。骰子将以螺旋方式(顺时针)滚动,以用数字填充每个字段(仅一次)。计算打印数字的总和。当 n=5(结果 = 81)时,骰子的移动和打印的数字的可视化表示

01 02 03 04 05
16 17 18 19 06
15 24 25 20 07
14 23 22 21 08
13 12 11 10 09

6 5 1 2 6
4 5 3 2 4
1 1 3 1 1
3 2 3 5 3
6 5 1 2 6

这是一个家庭作业问题,但如果不了解所有可能的情况,我无法弄清楚如何有效地做到这一点。如果有人能给我一个解决方案和解释,那就太棒了(不需要代码,我想自己做)。

【问题讨论】:

  • 我真的不明白你的问题。特别是“有效地不经历所有可能的情况”是什么意思。你可以在 25 次相对简单的迭代中解决这个问题。您是否想提出一个公式,给定n,将在恒定时间内解决它?

标签: algorithm matrix dice spiral


【解决方案1】:

一种可能的干净方法是定义一个 Dice 类,如下所述。

class Dice
{
public:
    Dice();
    int face_down();
    void roll_west();
    void roll_east();
    void roll_north();
    void roll_south();
    void set_initial_config(int face_down,int east,int north,int west,int south);
    ~Dice();
private:
    /// variables for your state etc
};

如果你成功实现了 Dice,那么剩下的工作就是简单地模拟掷骰子了。

int roll(int n,int m){ // grid dimensions

    std::vector<std::vector<bool> > visited(n,std::vector<bool>(m,0));

    int i=0,j=-1;
    int dir=0;
    bool dir_changed;
    int dir_change_count=0;
    int sum=0;
    Dice d;

    while(dir_change_count<4){

        dir_changed=0;
        switch(dir){
            case 0:
                if(j+1<m and !visited[i][j+1]){
                    j++;
                    visited[i][j+1]=1;
                    d.roll_east();
                }else{
                    dir_changed=1;
                    dir++;
                }
                break;
            case 1:
                if(i+1<n and !visited[i+1][j]){
                    i++;
                    visited[i+1][j]=1;
                    d.roll_south();
                }else{
                    dir_changed=1;
                    dir++;
                }
                break;
            case 2:
                if(j-1>=0 and !visited[i][j-1]){
                    j--;
                    visited[i][j-1]=1;
                    d.roll_west();
                }else{
                    dir_changed=1;
                    dir++;
                }
                break;
            case 3:
                if(i-1>=0 and !visited[i-1][j]){
                    i--;
                    visited[i-1][j]=1;
                    d.roll_north();
                }else{
                    dir_changed=1;
                    dir++;
                }
                break;
        }
        if(!dir_changed){
            sum+=d.face_down();
            dir_change_count=0;
        }else{
            dir_change_count++;
        }
    }

    return sum;
}

【讨论】:

  • 如果您接受答案,也请为该问题投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2015-04-30
  • 2019-03-31
  • 2012-02-29
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多