背景
機房裡面的人最愛玩遊戲,這句活說的一點也不錯,每天都會有人設計出一種新的小游
戲。。。
問題描述
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....