每日两小时编程之旅(七)

每日两小时编程之旅(七)

算法篇-mooc学习

递归

1.汉诺塔问题

#include<bits/stdc++.h>

using namespace std;

void Hanoi(int n, char src, char mid, char dest)
//将src座上的n个盘子,以mid为中转,移动到dest座
{
    if(n==1)//只需要移动一个盘子
    {
        cout<<src<<"->"<<dest<<endl;//直接将盘中从src移动到dest即可
        return;//递归终止
    }
    Hanoi(n-1,src,dest,mid);//先将n-1个盘子从src移动到mid
    cout<<src<<"->"<<dest<<endl;//再将一个盘子从src移动到dest
    Hanoi(n-1,mid,src,dest);//最后将n-1个盘子从mid移动到dest
    return;
}

int main()
{
    int n;
    char a,b,c;
    cin>>n>>a>>b>>c;
    Hanoi(n,a,b,c);
    return 0;
}

2.n皇后问题(不知道为什么没有输出)

#include<bits/stdc++.h>

using namespace std;
int N;
int queenPos[100];
//用来存放算好的皇后位置。最左上角是[0,0]

void NQueen(int k)//在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
{
    int  i;
    if(k==N)
    {
        for(i=0;i<N;i++)
        {
            cout<<queenPos[i]+1<<" ";
        }
        cout<<endl;
        return;
    }
    for(i=0;i<N;i++)
    {
        int j;
        for(j=0;j<k;j++)//和已经摆好的k个皇后的位置比较,看是否冲突
        {
            if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j)) break;//冲突,则试下一个位置
        }
        if(j==k)//当前选的位置i不冲突
        {
            queenPos[k]==i;//将第k个皇后摆放在位置i
            NQueen(k+1);
        }
    }
}

int main()
{
    cin>>N;
    NQueen(0);//从第0行开始摆皇后
    return 0;
}

3.(逆)波兰表达式(难以理解)

#include<bits/stdc++.h>

using namespace std;

double exp()//读入一个逆波兰表达式,并计算其值
{
    char s[20];
    cin>>s;
    switch(s[0])
    {
        case '+':return exp()+exp();
        case '-':return exp()-exp();
        case '*':return exp()*exp();
        case '/':return exp()/exp();
        default: return atof(s);//atof()将字符串转换为浮点型数
        break;
    }
}

int main()
{
    printf("%lf",exp());
    return 0;
}

4.表达式求值

#include<bits/stdc++.h>

using namespace std;

int factor_value();//因子
int term_value();//项
int expression_value();//表达式

int main()
{
    cout<<expression_value()<<endl;
    return 0;
}

int expression_value()//求一个表达式的值
{
    int result=term_value();//求第一个项的值
    bool more=true;
    while(more)
    {
        char op=cin.peek();//看一个字符,不取走
        if(op=='+'||op=='-')
        {
            cin.get();//从输入中取走一个字符
            int value=term_value();
            if(op=='+') result+=value;
            else result-=value;
        }
        else more=false;
    }
    return result;
}

int term_value()//求一个项的值
{
    int result=factor_value();//求第一个因子的值
    while(true)
    {
        char op=cin.peek();
        if(op=='*'||op=='/')
        {
            cin.get();
            int value=factor_value();
            if(op=='*') result*=value;
            else result/=value;
        }
        else break;
    }
    return result;
}

int factor_value()//求一个因子的值
{
    int result=0;
    char c=cin.peek();
    if(c=='(')
    {
        cin.get();
        result=expression_value();
        cin.get();
    }
    else
    {
        while(isdigit(c))//isdigit字面意思,是整数返回true不是返回false
        {
            result=10*result+c-'0';
            cin.get();
            c=cin.peek();
        }
    }
    return result;
}

5.上台阶(斐波那契数列)

#include<bits./stdc++.h>

using namespace std;
int N;

int stairs(int n)
{
    if(n<0) return 0;
    if(n==0) return 1;
    return stairs(n-1)+stairs(n-2);
}


int main()
{
    while(cin>>N)
    {
        cout<<stairs(N)<<endl;
    }
    return 0;
}

6.放苹果

#include<bits/stdc++.h>

using namespace std;

int f(int m,int n)
{
    if(n>m) return f(m,m);
    if(m==0) return 1;
    if(n==0) return 0;
    return f(m,n-1)+f(m-n,n);
}

int main()
{
    int t,m,n;//m表示苹果,n表示盘子
    cin>>t;
    while(t--)
    {
        cin>>m>>n;
        cout<<f(m,n)<<endl;
    }
    return 0;
}

7.算24

#include<bits/stdc++.h>

using namespace std;
double a[5];
#define EPS 1e-6

bool isZero(double x)
{
    return fabs(x)<=EPS;
}

bool count24(double a[],int n)
{
    if(n==1)
    {
        if(isZero(a[0]-24)) return true;
        else return false;
    }
    double b[5];
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)//枚举两个数的组合
        {
            int m=0;//还剩下m个数,m=n-2
            for(int k=0;k<n;k++)
            {
                if(k!=i&&k!=j) b[m++]=a[k];//把其余数放入b
            }
            b[m]=a[i]+a[j];
            if(count24(b,m+1)) return true;
            b[m]=a[i]-a[j];
            if(count24(b,m+1)) return true;
            b[m]=a[j]-a[i];
            if(count24(b,m+1)) return true;
            b[m]=a[i]*a[j];
            if(count24(b,m+1)) return true;
            if(!isZero(a[j]))
            {
                b[m]=a[i]/a[j];
                if(count24(b,m+1)) return true;
            }
            if(!isZero(a[i]))
            {
                b[m]=a[j]/a[i];
                if(count24(b,m+1)) return true;
            }
        }
    }
    return false;
}

int main()
{
    for(int i=0;i<4;i++) cin>>a[i];
    if(count24(a,4)) cout<<"YES!"<<endl;
    else cout<<"NO!"<<endl;
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务