机器人的舞蹈(hdu 2232)

机器人的舞蹈

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 292    Accepted Submission(s): 154


Problem Description
一天四个不同的机器人a、b、c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同一条边视为临近)的一个毯子移动或停留在原来的毯子(同一块毯子可以有多个机器人停留),这个时候机器人的制造者你想知道经过n步的移动有多少种方式可以让每个毯子上都有机器人停留。
 
Input
对于每组数据输入一个整数n(0<=n<=100)
 
Output
对于每组输入输出一个整数表示方法种数,种数可能很大请对9937取模。
 
Sample Input
1
 
Sample Output
9
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  2235 2233 2234 2237 2238 
思路:总共给四个机器人那么分别记为1 2 3 4,记4个位置1 2 3 4
开个三维数组a,第一维表示步数,第二维表示哪个机器人,第三维表示机器人所在的位置.
那么递推a[i][j][k]=sum(a[i-1][j][s])(abs(k-s)!=2)
那么最后枚举四个机器人所在的位置,然后sum+=四个位置方案数的乘积。
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<queue>
 7 #include<string.h>
 8 #include<stack>
 9 #include<vector>
10 #include<map>
11 #define sc(x) scanf("%I64d",&x)
12 #define pr(x) printf("%I64d",x)
13 #define prr(x) printf("%I64d
",x)
14 #define prrr(x) printf(" %I64d",x)
15 #define FOR(i,p,q) for(int i=p;i<=q;i++)
16 const int NN=9937;
17 using namespace std;
18 int a[101][5][5];
19 int main(void)
20 {
21     int n,i,j,k,p,q,kk;
22     for(i=1; i<=4; i++)
23     {
24         for(j=1; j<=4; j++)
25         {
26             if(i==j)
27             {
28                 a[0][i][j]=1;
29             }
30             else a[0][i][j]=0;
31         }
32     }//当为0步的时候的初始状态
33     for(i=1; i<=100; i++)
34         for(kk=1; kk<=4; kk++)
35             for(j=1; j<=4; j++)
36                 for(int zz=1; zz<=4; zz++)
37                     if(abs(zz-j)!=2)
38                         a[i][kk][j]=(a[i][kk][j]+a[i-1][kk][zz])%9937;//递推计算第几步的时候的每个机器人所对应4个位置的方案数
39 
40     int ak[101];
41     int t[5];//判断是否在不同的4个位置
42     for(i=1; i<=100; i++)
43     {
44         int sum=0;memset(t,0,sizeof(t));
45         for(int r=1; r<=4; r++)//枚举24种状态
46         {
47             t[r]++;
48             for(int z=1; z<=4; z++)
49             {
50                 t[z]++;
51                 for(int s=1; s<=4; s++)
52                 {
53                     t[s]++;
54                     for(int y=1; y<=4; y++)
55                     {
56                         t[y]++;
57                         int uu=0;
58                         for(int rt=1; rt<=4; rt++)
59                         {
60                             if(t[rt]!=0)
61                             {
62                                 uu++;
63                             }
64                         }
65                         if(uu==4)
66                         {
67                             int sum1=((a[i][1][r]%NN*a[i][2][z]%NN)%NN*(a[i][3][s]%NN*a[i][4][y]%NN)%NN)%NN;
68                             if(sum1<0)
69                             {
70                                 printf("%d %d
",a[i][3][s],a[i][4][y]);
71                                 printf("%d
",sum1);
72                             }
73                             sum=(sum+sum1)%NN;
74 
75                         }
76                         t[y]--;
77                     }
78                     t[s]--;
79                 }
80                 t[z]--;
81             }
82             t[r]--;
83         }
84         ak[i]=sum;
85 
86     }
87     while(scanf("%d",&k)!=EOF)
88     {
89         printf("%d
",ak[k]);
90     }
91     return 0;
92 }
油!油!you@
原文地址:https://www.cnblogs.com/zzuli2sjy/p/5145511.html