分析2小程序的算法

2025-12-18 03:16:48
推荐回答(3个)
回答1:

没什么好难的,只是分给得有点低哈
给你加上注释就很清楚了.
第一题:2255
#include
using namespace std;
char first[27]; //存前序遍历
char middle[27];//存中序遍历
struct node //树的结点
{
char a;
node *left,*right; //树的左右子树
};
int pos(char x,int i) //找这x点在中序队列的位置
{
int j;
for(j=i;j{
if(middle[j]==x)
return j;
}
}
void Creat(node **root,int i,int j,int k) //根据前中序建树
{
int m,leftlen,rightlen;
if(k<=0)
*root=NULL;
else
{
*root=new node;
(*root)->a=first[i]; //前序序列的第i结点
m=pos(first[i],j); //找这点在中序队列的位置
leftlen=m-j; //左子树的长度
rightlen=k-leftlen-1;//石子树的长度
Creat(&((*root)->left),i+1,j,leftlen); //递归建左子树
//i+1 该结点的左子树结点的位置,j标记找这点在中序队列的位置时从哪个点找起
Creat(&((*root)->right),i+leftlen+1,m+1,rightlen); //递归建右子树
//i+leftlen+1 是指该结点的右子树结点的位置,m+1同上
}
}
void Post(node **root) //后序遍历输出,递归
{
if((*root)==NULL) return;
else
{
Post(&((*root)->left)); //先找左子树
Post(&((*root)->right)); //再找右子树
cout<<(*root)->a; //最后输出根
}
}
int main()
{

while(scanf("%s %s",first,middle)!=EOF){
node *root;
Creat(&root,0,0,strlen(first)); //根据前中序建树,最参数为树的长度
Post(&root); //后序遍历输出
cout<}
return 0;
}
//--------------------------------------------------------------------
第二题:2260
#include
int main()
{
int n,i,j,sumc,sumr,keyc,keyr,sr,sc;
int matrix[100][100];
while(scanf("%d",&n)&&n)
{
sr=0; //行标记
sc=0; //列标记
for(i=0;i{
sumr=0; //行,出始SUM
for(j=0;j{
scanf("%d",&matrix[i][j]); //读入每行
sumr+=matrix[i][j]; //计算行SUM
}
if(sumr%2!=0) //如果是奇数
{
keyr=i+1; //那么记录一下这一行的行号,+1是喜欢这里是0开始算,题目是一开始算
sr++; //行的记录值+1
}
}
if(sr>1) //如果有一行是奇数的,那么就Corrupt
{
printf("Corrupt\n");
continue;
}
for(j=0;j{
sumc=0; //列,出始SUM
for(i=0;isumc+=matrix[i][j]; //计算列SUM
if(sumc%2!=0) //如果是奇数
{
keyc=j+1; //那么记录一下这一行的列号
sc++; //列的记录值+1
}
}
if(sc==0&&sr==0) //如果记录值都没变,每行每列的SUM都为偶数
printf("OK\n"); //那么就打出OK
else if(sc==1&&sr==1) //如果有一行和一列都为1次记录,即有一行和一列SUM为奇
printf("Change bit (%d,%d)\n",keyr,keyc); //那么改变这一点就OK了
else printf("Corrupt\n"); //否则就只好Corrupt了
}
}

回答2:

递推公式!!!!

回答3:

hfggusii=fgguag=vhwyixcj=gwytvmg=sffbHgteun=dfjkABhxdf=gdsyfwkun=dgjsgdabjk=dsgfygfgas=sfchgfygfy=fhjsgyG=hjdhhjhs=0