以螺旋方式掷骰子
Rolling a dice in a spiral
给定一个 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
这是一道家庭作业题,但如果不考虑所有可能的情况,我无法弄清楚如何有效地做到这一点。如果有人能给我一个解决方案和解释,那就太棒了(不需要代码,我想自己做)。
一种可能的干净方法是定义一个 class 骰子,如下所述。
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;
}
给定一个 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
这是一道家庭作业题,但如果不考虑所有可能的情况,我无法弄清楚如何有效地做到这一点。如果有人能给我一个解决方案和解释,那就太棒了(不需要代码,我想自己做)。
一种可能的干净方法是定义一个 class 骰子,如下所述。
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;
}