现在是1月1日 晚上一点半 老师白天说给布置题目了 我本来没准备写的 但是一道新的汉诺塔题吸引了我的注意 从此踏上不归路。。。。。、
有一说一 这次布置的题目质量有点高 搜索动态规划都有 我菜鸡可能大部分不会写了
是c语言的课 我却没怎么老老实实用c写 这回试试纯用c写
我把认为有点意思的题题目复制了 水题就放后后面 直接上题目截图
Problem C: 汉诺塔Ⅲ
Description
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
那些智力题总是要求人们用最少的步骤完成题目中的要求。为什么非要最少呢?这次我们来点特别的,我希望你的程序能够用最多的步数达到要求,而且在此过程中不重复出现任何一种状态。
请联想曾经学过的汉诺塔知识。
Input
输入包含多组数据测试,每组数据只有圆盘数n( 1 <= n <= 12)
Output
对于每组数据输出符合条件的搬盘子的最多次数
Sample Input
1
3
12
Sample Output
2
26
531440
#include<stdio.h>
int main()
{
int a[20]={0,2};
int n,i;
while(~scanf("%d",&n))
{
for(i=2;i<=n;i++)
a[i]=3*a[i-1]+2;
printf("%d\n",a[n]);
}
return 0;
}
Problem D: 你的名字
Description
你的名字?以及说出你的身份证号码。在某个世界有正好十亿人,神的眼中,每个人都拥有一个整数作为灵魂编码(1~1000000000)。神提供了两种操作改变你的灵魂编码:
- 将当前整数乘以2。(比如从3变成6)。
- 在当前整数的右边添加1。(比如从3变成31)。
我的灵魂编码是a,她的灵魂编码是b。我能变成她么(在一系列操作后使得a==b)?
Input
输入包含多组数据测试,每组数据包含整数a,b,(1 ≤ a < b ≤ 1000000000)。(建议使用long long保存数字)
Output
如果我能通过神提供的两种操作将我变成她那么输出YES,否则输出NO。如果可以的话请输出最少执行多少次,以及执行的具体过程。
Sample Input
1 3
1 4
1 1111
Sample Output
NO
YES 2
1 2 4
YES 3
1 11 111 1111
#include<stdio.h>
int main()
{
long long a,b,bj[1000]={0};
int i,count,flag;
while(~scanf("%lld%lld",&a,&b))
{
count = 0;flag = 1;
bj[count] = b;
while(a < b)
{
if(b%10 == 1)
{b/=10;count++;bj[count]=b;}
else if(b%2 ==0)
{b/=2;count++;bj[count]=b;}
else
break;
}
if(a != b)
printf("NO\n");
else
{
printf("YES %d\n",count);
for(i=count;i>0;i--)
printf("%lld ",bj[i]);
printf("%lld\n",bj[0]);
}
}
return 0;
}
#include<stdio.h>
int main()
{
int t,n,i,temp,min;
while(~scanf("%d",&t))
{
while(t--)
{
min=10000000;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&temp);
if(temp < min)
min = temp;
}
printf("%d\n",min);
}
}
return 0;
}
#include <stdio.h>
int n, res,max;
int chess[10][10];
int juge(int x, int y)
{
int i, j;
for (i = y; i >= 0; i--)
{
if (chess[x][i] == 1)return 0;
if (chess[x][i] == 2)break;
}
for (i = y; i < n; i++)
{
if (chess[x][i] == 1)return 0;
if (chess[x][i] == 2)break;
}
for (i = x; i >= 0; i--)
{
if (chess[i][y] == 1)return 0;
if (chess[i][y] == 2)break;
}
for (i = x; i < n; i++)
{
if (chess[i][y] == 1)return 0;
if (chess[i][y] == 2)break;
}
return 1;
}
void dfs()
{
int i, j;
if (res > max)max = res;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (!chess[i][j] && juge(i, j))
{
chess[i][j] = 1; //选择在该点放碉堡
res++;
dfs();
chess[i][j] = 0; //选择在该点不放碉堡 这种感觉有点像动态规划的思想
res--;
}
}
}
}
int main()
{
char str[10];
int i, j;
while (scanf("%d", &n) != EOF, n)
{
max = 0;
for (i = 0; i < n; i++)
{
scanf("%s", str);
for (j = 0; j < n; j++)
{
if (str[j] == ‘X‘)chess[i][j] = 2;
else chess[i][j] = 0;
}
}
res = 0;
dfs();
printf("%d\n", max);
}
return 0;
}