zoukankan      html  css  js  c++  java
  • 机器人的舞蹈(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@
  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5145511.html
Copyright © 2011-2022 走看看