12.29练习总结

 第一题:迷宫


题目描述



给定一个N×M 方格的迷宫,迷宫里有 T处障碍,障碍处不可通过。

在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案

输入格式



第一行为三个正整数 N,M,TN,M,T,分别表示迷宫的长宽和障碍总数。

第二行为四个正整数 SX,SY,FX,FYSX,SY,FX,FY,SX,SYSX,SY 代表起点坐标,FX,FYFX,FY 代表终点坐标。

接下来 TT 行,每行两个正整数,表示障碍点的坐标。

 输出格式



输出从起点坐标到终点坐标的方案总数。

 输入 



2 2 1
1 1 2 2
1 2

 输出 


1

 说明/提示


对于 100\%100% 的数据,1 \le N,M \le 51≤N,M≤5,1 \le T \le 101≤T≤10,1 \le SX,FX \le n1≤SX,FX≤n,1 \le SY,FY \le m1≤SY,FY≤m。

分析


此题我们需要使用深度搜索,首先我们先用一个二维数组来储存这个迷宫刚开始的时候起点在(sx,sy)处,让其一次一次的尝试按照顺时针的顺序(右,下,左,上),每成功一次,计数器加一。要判断是否到了终点,就只需要判断当前坐标和终点坐标是否相等,若没有在终点,就上下左右找,通过tx,ty来存储当前坐标,再通过一个数组来记录经过的点是否在路径中(避免重复访问与是否越界,是否遇到障碍物),若均无则继续进行拓展。

 代码如下:

#include
int sum=0;
int N,M,T;
int sx,sy,fx,fy;
int a[100][100]={0},b[100][100];
void dfs(int x,int y,int step)
{
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    int tx,ty,k;
    if(x==fx&&y==fy)
    {
        sum++;
        return ;
    }
    for(k=0;k<=3;k++)
    {
        tx=x+next[k][0];
        ty=y+next[k][1];
        if(tx<1||tx>N||ty<1||ty>M)
        {
            continue;
        }
        if(a[tx][ty]==0&&b[tx][ty]==0)
        {
            b[tx][ty]=1;
            dfs(tx,ty,step+1);
            b[tx][ty]=0;
        }
    }
    return ;
}
int main()
{
    int i;
    scanf("%d %d %d",&N,&M,&T);
    scanf("%d %d",&sx,&sy);
    scanf("%d %d",&fx,&fy);
    int fc,fd;
    for(i=1;i<=T;i++)
    {
        scanf("%d %d",&fc,&fd);
        a[fc][fd]=1;
    }
    b[sx][sy]=1;
    dfs(sx,sy,0);
    printf("%d",sum);
    return 0;
}

 第二题:小叶子学英文


题目描述


小叶子现有一个非负整数n,它的任务是计算 n 的各位数的和 , 并且按英语输出总和中的每一个数字。

输入


每次一个整数n,n<=10^100

输出


按要求输出。

样例输入 


12345

样例输出 


one five

 分析


由于数据太大,所以不能用数组需要用字符数组来记录数据,然后再将该数的各个部分相加,再利用一个数组将和的各个数字存起来,然后利用switch循环结构,可输出答案。

 代码如下:

#include
#include
int main()
{
    char n[100];
    scanf("%s",n);
    long long a[1000],l,i,j,sum=0;
    l=strlen(n);
    for(i=0; i=0; j--)
    {
        switch(a[j])
        {
        case 1:
            printf("one ");
            break;
        case 2:
            printf("two ");
            break;
        case 4:
            printf("four ");
            break;
        case 5:
            printf("five ");
            break;
        case 6:
            printf("six ");
            break;
        case 7:
            printf("seven ");
            break;
        case 8:
            printf("eight ");
            break;
        case 9:
            printf("nine ");
            break;
        case 0:
            printf("zero ");
            break;
        }
    }
    return 0;
}

 第三题:ICPC Fighting!

题目描述


在ICPC比赛中,气球的分配方式如下。

每当一个团队解决了一个问题,该团队就得到一个气球。
第一个解决一个问题的队伍可以得到一个额外的气球。
一场比赛有26个问题,标记为A,B,C,...,Z。你会得到比赛中已解决的问题的顺序,用字符串s表示,其中第i个字符表示问题s[i]已经被某个团队解决。没有团队会两次解决同一个问题。
确定各队收到的气球总数。请注意,有些问题可能没有被任何一个团队所解决。

输入


输入的第一行包含一个整数t(1≤t≤100)--测试用例的数量。

每个测试用例的第一行包含一个整数n(1≤n≤50)--字符串的长度。

每个测试案例的第二行包含一个长度为n的字符串s,由大写英文字母组成,表示已解决问题的顺序。

输出


对于每个测试案例,输出一个整数--各队收到的气球总数。

样例输入 


4
3
ABA
1
A
3
ORZ
5
BAAAA

样例输出 


5
2
6
7

 分析


其实经过分析就是计算字符串的个数+不同字符的数量就行了。当然也可以按题目的思路一步一步走计算每个团队的得分来得出答案。

 代码如下:

#include
int n;
char a[51];

int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%s", &n, a);
        int ans=0, vis[26]= {0};
        for(int i=0; i

 第四题:斐波那契数列

题目描述


编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列。

输入


一个整型数n

输出


题目可能有多组不同的测试数据,对于每组输入数据,
按题目的要求输出相应的斐波那契图形。

样例输入 


6

样例输出 


0
0 1 1
0 1 1 2 3
0 1 1 2 3 5 8
0 1 1 2 3 5 8 13 21
0 1 1 2 3 5 8 13 21 34 55

 分析


此题需要使用递归,然后知道斐波那契数列的规律就很好解了 。

 代码如下:

#include
int fib(int x)
{
    if(x==0)
    {
        return 0;
    }
    else if(x==1)
    {
        return 1;
    }
    else
    {
        return fib(x-1)+fib(x-2);
    }
}
int main()
{
    int n,i,j;
    while(~scanf("%d",&n))
    {
        for(i=0;i

 第五题: 谁拿了最多奖学金(JSU-ZJJ)

题目描述


某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

  1)  院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

  2)  五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

  3)  成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

  4)  西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

  5)  班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

  只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

  现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

输入


每组测试数据的输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

输出


输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。

样例输入 


4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

样例输出 


ChenRuiyi
9000
28700

 分析


本题使用结构体解决会简单些,建立一个结构体数组来记录多个学生的名字等各种成绩,然后再通过各种条件来计算总奖学金,再进行比较,找出奖学金最高的一位。

其次需要注意的是:第一,多组输入。第二,奖学金啥的不要忘了初始化。

 代码如下:

#include
struct student
{
    char name[20];
    int a;//期末平均
    int b;//班级评议
    char c;//是否为学生会干部;
    char d;//西部
    int e;//论文数
    int sum;//奖金总数
} s[100],t;
int main()
{
    int n,i,sum1=0,j;
    while(~scanf("%d",&n))
    {
        sum1=0;
        for(i=0; i80&&s[i].e>=1)
            {
                s[i].sum=s[i].sum+8000;//院士奖学金
            }
            if(s[i].a>85&&s[i].b>80)//五四奖学金
            {
                s[i].sum=s[i].sum+4000;
            }
            if(s[i].a>90)//成绩优秀奖
            {
                s[i].sum+=2000;
            }
            if(s[i].a>85&&s[i].d=='Y')
            {
                s[i].sum+=1000;
            }
            if(s[i].b>80&&s[i].c=='Y')
            {
                s[i].sum+=850;
            }
            sum1=s[i].sum+sum1;
        }
        int q=0;
        for(i=0; is[q].sum)
            {
                q=i;
            }
        }
        printf("%s\n",s[q].name);
        printf("%d\n%d\n",s[q].sum,sum1);
    }
    return 0;
}

 

你可能感兴趣的:(c语言,深度优先,算法,c语言)