HDOJ 2238 機械人的舞蹈II

2021-06-05 12:54:27 字數 1594 閱讀 3551

清明去鄉下掃了一圈墓~~回來把這題a了...首先說一下這題和hdoj-2232的區別...這道題描述上和2232的區別就是本題的機械人是一樣的...2232裡的機械人是不同的...那麼造成的區別在於轉移的時候差別...如有

4   0                  2   2                                         (1,2)  (3,4)    (1,3)  (2,4)

0   0       ---->    0   0     如果是不同機械人..那麼   0        0    與   0        0  是不同的兩種走位...而當所有機械人相同得情況..這兩種走位是同乙個走位...但走位的結果..不論機械人相同與否..狀態是一樣的..

所以這兩題從狀態上來說是一樣的...差別僅在於狀態轉移時的方案數不同...

構造矩陣就用搜尋...列舉從每個狀態在一單位時間的變化下能有幾種方式轉化為另乙個狀態...也就是dfs了..

hdoj-2232是每一層列舉移動乙個機械人.列舉了4層後得到列舉出來的矩陣..判斷是那個矩陣(通過翻轉,對稱阿..)..然後兩者方案數++

而本題在構造矩陣時稍微麻煩一些....並不是列舉每個機械人怎麼走..而是每局每個格仔上的機械人怎麼來分配...如

4 0 

0  0

可以分解成3個向右,1個向下 或 2個向右,2個向下..等等之類的...這樣直接討論這個格仔的機械人如何分配...就避免了由於機械人相同,而用2232的方法列舉機械人時有先後順序關係而造成的錯誤了...

ac**:

#include#include#include#include#define n 8

#define ll long long

using namespace std;

const int m[n][n]=

;struct node

h,temp,t,_2m[34];

node matrix_mul(node a,node b)

memset(t.s,0,sizeof(t.s));

for (i=0;il)

t=matrix_mul(t,_2m[p]);

l-=k;

} return t;

} int main()

};int a[n][n],p,temp[4],i,t[4],w[4],z;

int judge()

}temp[0]=t[2]; temp[2]=t[0]; temp[1]=t[3]; temp[3]=t[1];

for (i=0;i<5;i++)

} z++;

for (i=0;i<4;i++) s[z][i]=t[i];

return z;

}void dfs(int k)

for (x=0;x<=s[p][k];x++)

for (y=0;y<=s[p][k]-x;y++)

else

if (k==1)

else

if (k==2)

else

if (k==3)

}return;

}int main()

z++;

for (i=0;i

HDU 2332 機械人的舞蹈 遞推

直接進入正題,這題要求解的是乙個條件極其寬鬆下的組合題,似乎在看見這題的時候,我們就能遇見這道題的答案會是多麼的龐大,所以題中也才會有 9937 這樣的提示。對於如此大的乙個運算,只走一步的話還好辦,有9種情況,順時針和逆時針旋轉2次加上相鄰兩個交換位置 交換一對的4次,交換兩對的2次 最後加上原地...

小i機械人伴侶

小i機械人成立於2001年,是全球領先的智慧型機械人技術提供和平台運營商,使用者超過1億,100億次以上的互動,覆蓋100多個國家,建立了全球最大的智慧型機械人雲服務平台。小i機械人的創新平台和產品及其專業服務體系使得智慧型機械人在市場上得到了廣泛應用,形成了智慧型客服 智慧型知識庫 智慧型微應用和...

機械人走方格I

有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。給定兩個正整數int x,int y,請返回機械人的走法數目。保證x y小於等於12。機械人 public static int count int x,int y count...