机器人的舞蹈
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
思路:总共给四个机器人那么分别记为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 }