这题涉及到新的算法,好好学习!
这是一道经典的二分匹配题+匈牙利算法【
趣写算法系列——匈牙利算法】,匹配过程有递归和回溯。
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxsize 501
int line[maxsize][maxsize];
int used[maxsize];
int boy[maxsize];
int M,N;
int find(int x);
int main()
{
int K;
int i,x,y;
int num;
while(scanf("%d",&K),K)
{
memset(boy,0,sizeof(boy));
memset(line,0,sizeof(line));
scanf("%d%d",&M,&N);
for(i=1; i<=K; i++)
{
scanf("%d%d",&x,&y);
line[x][y]=1;
}
num=0;
for(i=1; i<=M; i++) //依次扫描每个女生
{
memset(used,0,sizeof(used));
if(find(i))
num++;
}
printf("%d\n",num);
}
return 0;
}
/*匈牙利算法*/
int find(int x)
{
int i;
for(i=1; i<=N; i++) //依次扫描每个男生
{
if(line[x][i]==1&&used[i]==0) //如果女生x愿意和男生i一起坐,
{
used[i]=1;//男生i 被分配
if(boy[i]==0||find(boy[i]))//男生i还未被分配或者男生i有其他的中意者
{
boy[i]=x;
return 1;
}
}
}
return 0;
}
题意:升级版汉诺塔,在经典的汉诺塔问题的基础上添加新的规则:每次移动圆盘只能移到相邻的铁棒上;
依然采用递推的方法:设最左边开始有n个圆盘,那么最后完成之前一定会经历以下情景,前n-1个盘已经位于右边相邻的铁棒上,设该过程需要耗用x步,然后再重复该过程,将n-1个圆盘移动最右边的铁棒上,这两步实际上就是只有n-1个圆盘的汉诺塔问题,令总的步数为f(n-1);然后将最底下的圆盘移到第二个铁棒,共1步,再将最右边的圆盘全部移到最左边,共f(n-1)步,再将中间的圆盘移到最右边,共1步,再将最左边的圆盘移到最右边,共f(n-1)步,完成n个圆盘的移动任务。
所以递推公式为:f(n)=3*f(n-1)+2;
#include <stdio.h>
using namespace std;
int main()
{
int i;
long long int f[36];
f[1]=2;
f[2]=8;
f[3]=26;
for(i=4;i<=35;i++)
f[i]=3*f[i-1]+2;
while(scanf("%d",&i)!=EOF)
printf("%I64d\n",f[i]);
return 0;
}