Problem 3 骰子遊戲

2021-08-02 07:12:01 字數 3077 閱讀 4958

背景

機房裡面的人最愛玩遊戲,這句活說的一點也不錯,每天都會有人設計出一種新的小游

戲。。。

問題描述

wzoi 的lzyp 大牛設計出一款小遊戲。這個遊戲地圖是乙個

由n 行n 列的棋盤組成的(每乙個小格都是1×1 正方形),如右圖

就是乙個5×5 的的地圖。lzyp 手中有一枚正方體,這枚正方體的

稜長恰好為1。也就是說,這枚這正方體恰好可以覆蓋乙個棋盤格仔。

在正方體的每乙個面上分別標上了乙個非負整數w,當然正方體的

六個面上的數字不一定相同。現在將這枚正方體放在棋盤上(恰好覆

蓋乙個格仔),乙個人可以你在棋盤上滾動該立方體(立方體可以向其前、後、左、右四個

方向滾動)。在滾動的過中,立方體底部與棋盤接觸的那個面上的數字被加入總和s。

lzyp 想要知道該怎樣滾動這個正方體,才能使正方體從乙個格仔滾動到另乙個格仔得到

的s 值最小。lzyp 想要知道這個最小值s,當然他會告訴你起始格仔和目標格仔的座標。

注意:立方體在起始格仔和目標格仔上的地面數字也要被計入總和,起始格仔和目標格仔

是不同的。

為了刁難你,lzyp 決定問你t 個問題,當然每次你都需要正確告訴他答案是多少;否則

他就會一直煩著你,那麼你就無法安心刷水題了。

輸入格式

輸入資料第一行包含三個整數n,t(分別用乙個空格隔開),分別表示棋盤有n 行n 列,

總共會有t 個問題;

第二行有6 個整數,表示立方體在開始格仔上各個面上的6 個數字,順序是:前面、後面、

上面、右面、下面、左面。這6 個整數用空格隔開。

接下來 t行,每行四個整數 x1,y1,x2,y2,表示起始格仔和目標格仔的座標(注意第乙個是

列號,第二個是行號)。輸入資料保證會有一條路徑從起始格仔到達目標格仔。

輸出格式

輸出資料總共t 行,每行乙個整數s,表示從起始格仔到目標格仔的最小和。

樣例輸入輸出

sample #1

cube.in 

5 10 8 1 2 1 1

5 2 5 3

cube.out 5

sample #2

cube.in 

5 11 1 1 1 1 1

1 2 2 3

cube.out 3

樣例解釋

對於sample #1,一條可行的路徑就是(5,2)(4,2)(4,1)(5,1)(5,2)(5,3),底面的數字

分別為1,1,0,1,1,1。

對於sample #2,一條可行的路徑就是(1,2)(2,2)(2,3),底面的數字分別為1,1,1。

資料規模

對於20%的資料,n≤10,0≤w≤10;

對於50%的資料,n≤50,0≤w≤100;

對於100%的資料,n≤100,0≤w≤1000。

對於100%的資料,t≤10.

時間限制1s

提示

正方體的滾動是指,沿著底面與棋盤格仔的乙個公共邊翻轉。每個格仔可以走多次,並且

每走一次,需要累加相應的權值。

分析:

題目大意:給你乙個n×n 的棋盤和乙個立方體(每個面上有乙個數字),將這個立方體從

乙個格仔滾到另乙個格仔,要求輸出最小的權值。

考察演算法 拆點 廣搜

演算法一

這是一道十分不錯的廣搜題目,它不同於一般的地圖遍歷。由於使用立方體的

滾動來實現路徑的形成,這就意味著每乙個點會出現多種狀態。同樣這也就告

訴我們這道題目需要拆點廣搜。

我們不妨設這個立方體的前面、後面、上面、右面、下面、左面的標號分別為

1,2,3,4,5,6。那麼簡單分析之後我們會發現只有以下24 種不同的狀態:

123456,124563,125634,126345,213654,214365,215436,216543,

351624,352416,354162,356241,461325,462513,463251,465132,

531426,532614,534261,536142,641523,642315,643152,645231.

然後我們每一次滾動的時候做出相應的狀態變化即可,具體實現可以參見程

序,最後的答案就是min。

這道題目的難點就在於要想到拆點進行廣搜,還需要有很強的實現能力。

時間複雜度:o(24*tn2) 空間複雜度:o(24*n2) 期望得分:100 分

#include#include#include#includeusing namespace std;

const int maxn=100+5;

const int size=262143,inf=2000000000;//262143是2^18-1(1<<18-1)。

int c[5][7]=,,,,};

int state[25]=;

int dx[5]=,dy[5]=;

struct node;

int dis[maxn][maxn][25];

bool v[maxn][maxn][25];

node q[size];

int sx,sy,ex,ey,k;

int head,tail,n,ans,test;

int d[7],t[7];

int number()

void bfs()}}

v[now.x][now.y][now.k]=false;

}ans=inf;

for(i=1;i<=24;i++)

if(dis[ex][ey][i]

Problem 3 二維陣列中的查詢

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。首先分析該陣列的特點,在向下和向右方向上,數值會遞增。以二維陣列中任意位置元素為例,同行右側元素皆大於該點,同列下側元素皆大於該點,因...

擲骰子遊戲

遊戲者每次投擲兩顆骨子,每個骰子是乙個正方體,當骰子停止時,將每個骰子朝上的點數相加,在第一次投擲骰子時,如果所得到的和為7或11,那麼遊戲者為勝 所得和為2 3或12則輸 如和為4 5 6 8 9或 10,則此和為遊戲者點數。如要想贏得勝利,必須繼續投擲骰子,直到取和得自己的點數 也即規則2的點數...

擲骰子遊戲

寫乙個搖骰子遊戲,要求使用者壓大小,賠率一賠一。要求 三個骰子,每個骰子的值從1 6,搖大小,每次列印搖出來3個骰子的值。import random defroll dice count 0 point 定義乙個空的點數變數儲存每次搖骰子獲得的數字 while count 3 num random....