2016年江西理工大学C语言程序设计竞赛(初级组)

问题 A: 木棒根数

解法:把所有的情况保存下来,加一下就好

#include<bits/stdc++.h>
using namespace std;
map<char,int>q;
class P
{
public:
    int cmd(string s)
    {
        int sum=0;
        for(int i=0;i<s.length();i++)
        {
            sum+=q[s[i]];
        }
        return sum;
    }
};
int main()
{
    string s;
    P solve;
    q['0']=6;
    q['1']=2;
    q['2']=5;
    q['3']=5;
    q['4']=4;
    q['5']=5;
    q['6']=6;
    q['7']=3;
    q['8']=7;
    q['9']=6;
    q['+']=2;
    q['-']=1;
    q['=']=2;
    cin>>s;
    cout<<solve.cmd(s)<<endl;
    return 0;
}

问题 B: 一个苹果都不给我

解法:三种情况,单独买,套装买,和混合买

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
    int n,m,p,q,ans[5];
    cin>>n>>m>>p>>q;
    ans[0]=n*m;
    ans[1]=n/p*q+(n%p)*m;
    ans[2]=(n/p+1)*q;
    sort(ans,ans+3);
    cout<<ans[0]<<endl;
    return 0;

}

问题 C: LED

 解法:保存图形,然后xjb搞

include<stdio.h>
#include<string.h>
int main()
{
    char num1[50]={" _     _  _     _  _  _  _  _ "};
    char num2[50]={"| |  | _| _||_||_ |_   ||_||_|"};
    char num3[50]={"|_|  ||_  _|  | _||_|  ||_| _|"};
    char str,a[50]={""};
    int i,k,j,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len;++i)
    {
        j=a[i]-'0';
        k=j*3;
        printf("%c%c%c",num1[k],num1[k+1],num1[k+2]);
    }
    printf("
");
    for(i=0;i<len;++i)
    {
        j=a[i]-'0';
        k=j*3;
        printf("%c%c%c",num2[k],num2[k+1],num2[k+2]);
    }
    printf("
");
    for(i=0;i<len;++i)
    {
        j=a[i]-'0';
        k=j*3;
        printf("%c%c%c",num3[k],num3[k+1],num3[k+2]);
    }
    printf("
");
    return 0;
}

问题 D: 路是自己选的

解法:应该都看出奇偶性关系了,一种是利用二进制,一种是二分,结果需要倒过来输出,所以使用了栈

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000005;
int b[MAXN];
int main()
{
    int x;
    int a[100];
    scanf("%d",&x);
    for(int i=0;i<64;i++)
    {
        scanf("%d",&a[i]);
        b[a[i]]=i;
    }
    int u=b[x];
    u=64+u;
    stack<char> s;
    while(u!=1)
    {
        if(u%2==0) s.push('L');else s.push('R');
        u=u/2;
    }
    while(!s.empty())
    {
        putchar(s.top());
        s.pop();
    }
    puts("");
    return 0;
}

问题 E: All roads lead to rome

解法:标准解法是dp,然而可以用组合数学来做,也就是C(n,m)

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    int n,m,l,r;
    int a,b,c,d,ans=1;
    cin>>n>>m>>a>>b>>c>>d;
    l=abs(a-c),r=abs(d-b);
    for(int i=l+r;i>l;i--){
        ans=ans*i/(l+r-i+1);
    }
    cout<<ans<<endl;
}

问题 F: 找不到北

解法:求最短路最好利用bfs,当然dfs也能做到(一道基础的搜索题)

#include<bits/stdc++.h>
using namespace std;
int inf=(1<<31)-1;
int Mx;
char m[12][12]={
"##########",
"#**#***#*#",
"#*#**##*##",
"#***##***#",
"##**#*#**#",
"#***#*#**#",
"#**#*****#",
"#****###*#",
"#***#**#*#",
"##########",
};
int a,b,c,d;
void dfs(int x,int y,int s)
{
    if(m[x][y]=='#')
    {
        return;
    }
    else if(x==c&&y==d)
    {
        Mx=min(Mx,s);
    }
    s++;
    m[x][y]='#';
    dfs(x,y-1,s);
    dfs(x,y+1,s);
    dfs(x+1,y,s);
    dfs(x-1,y,s);
    m[x][y]='*';
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        Mx=inf;
        cin>>a>>b>>c>>d;
        if(m[a][b]=='#'||m[c][d]=='#')
        {
            cout<<"-1"<<endl;
            continue;
        }
        else if(a==c&&b==d)
        {
            cout<<"0"<<endl;
            continue;
        }
        else
        {
            dfs(a,b,0);
            if(Mx==inf)
            {
                cout<<"-1"<<endl;
            }
            else
            {
               cout<<Mx<<endl;
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yinghualuowu/p/6130966.html