蓝桥杯 机器人塔

题目:相信你有题目了,我这就不啰嗦了。

思路:声明:我这种算法对于大数据还是会超时,但是搜了搜网上的答案,我这种算法应该比那种枚举底部再判断的效率高一些。我的思路是:先放第一层,两种情况A或者B,然后放下面的层数,每一层的第一个位置和第二个位置根据上面一层的第一个位置来放,如上一层第一个为A,则这一层第一个位置和第二个位置则为AA或者BB。然后第三个位置就根据同行前一个位置和上一层对应位置的字母判断。每一行第一个和第二个位置放好后,同层后面的位置就定了,直接填表就好。好像有点动态规划的意思,刚写完的代码没有时间整理,有点乱,可能代码中还有点小错误,但思路是没有问题的。好了,一切尽在代码中:

#include<stdio.h>
#define N 9
int m,n,cont=0;
void f(char dp[60][60],int k,int a,int b)
{
int i,j;
int x,y;
if(a>m||b>n)
return;
if(a==m&&b==n)
{
cont++;
return;
}
x=a;y=b;
for(i=0;i<=k;i++)
{
if(i==0)
{
if(dp[k][i]=='A')
{
dp[k+1][i]='B';
dp[k+1][i+1]='B';
b+=2;
}
if(dp[k][i]=='B')
{
dp[k+1][i]='A';
dp[k+1][i+1]='B';
a++;b++;
}
}
else
{
if(dp[k][i]=='A')
{
if(dp[k+1][i]=='A')
{
dp[k+1][i+1]='A';
a++;
}
else
{
dp[k+1][i+1]='B';
b++;
}
}
else
{
if(dp[k+1][i]=='A')
{
dp[k+1][i+1]='B';
b++;
}
else
{
dp[k+1][i+1]='A';
a++;
}
}
}
}
f(dp,k+1,a,b);
for(i=0;i<=k+1;i++)
if(dp[k+1][i]=='A')
a--;
else
b--;
i=0;
if(dp[k][0]=='A')
{
dp[k+1][i]='A';
dp[k+1][i+1]='A';
a+=2;
}
else
{
dp[k+1][i]='B';
dp[k+1][i+1]='A';
a++;b++;
}
for(i=1;i<=k;i++)
{
if(dp[k][i]=='A')
{
if(dp[k+1][i]=='A')
{
dp[k+1][i+1]='A';
a++;
}
else
{
dp[k+1][i+1]='B';
b++;
}
}
else
{
if(dp[k+1][i]=='A')
{
dp[k+1][i+1]='B';
b++;
}
else
{
dp[k+1][i+1]='A';
a++;
}
}
}
f(dp,k+1,a,b);
}
int main()
{
char dp[60][60];
scanf("%d%d",&m,&n);
dp[0][0]='A';
f(dp,0,1,0);
dp[0][0]='B';
f(dp,0,0,1);
printf("%d",cont);
return 0;

猜你喜欢

转载自blog.csdn.net/wj1098286097/article/details/80085436