首页 > 代码库 > 2016年江西理工大学C语言程序设计竞赛(初级组)

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<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,p,q,k=0,s,r;
    scanf("%d%d%d%d",&n,&m,&p,&q);
    s=n/p;
    r=n%p;
    k+=min(s*q,n*m);
    k+=min(q,m*r);
    printf("%d\n",k);
    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]={"\0"};
    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("\n");
    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("\n");
    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("\n");
    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;
}

 

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