纪念一次很丢人的经历(0分的考试)

本次机考我考了0分,这是很丢人的成绩。我对此深深的反思,在自己曾经做过的题错的多么离谱。
自己最近的态度及其懒散,每天抱着手机,也不好好认真的学习

‘1. 输出全排列(25 分)

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:

输入给出正整数n(<10)。
输出格式:

输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a​1​​,a​2​​,⋯,a​n​​排在序列b​1​​,b​2​​,⋯,b​n​​之前,如果存在k使得a​1​​=b​1​​,⋯,a​k​​=b​k​​ 并且 a​k+1​​< b​k+1​​。
输入样例:

3

输出样例:

123
132
213
231
312
321

在这里,我可以使用dfs算法,即利用深度优先算法来进行的

#include<string.h>
int a[10],b[10],n;//在这里数组全部为0
void dfs(int step)//step表示现在站在第几个盒子之前
{
    int i;
   if(step==n+1)//表明前N个盒子方好了
   {
          for(i=1;i<=n;i++)
              printf("%d",a[i]);
          printf("\n");
          return ;//返回上次调用函数
   }
   for(i=1;i<=n;i++)
   {
       //判断扑克牌位置
       if(b[i]==0)//表明还在受伤
       {
           //尝试收回;
           a[step]=i;
           b[i]=1;//已经不再手上
           //第step方好,需要走到下一个
           dfs(step+1);//函数帝国
           b[i]=0;//刚才收回
       }
   }
   return ;
}
int main()
{
    scanf("%d",&n);
    dfs(1);
    return 0;
}

2.. 通讯录排序(25 分)

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入格式:

扫描二维码关注公众号,回复: 2565870 查看本文章

输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+、-组成的字符串。
输出格式:

按照年龄从大到小输出朋友的信息,格式同输出。
输入样例:

3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543

输出样例:

wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678

我在写这个题的时候,排序一直出错,这道题还是我之前做过的题,在此记录

//我在这里实行的是快速排序,利用递归的方法
void quicksort(struct man *Head, struct man *tail)//如果是单链表排序则输入头节点和NULL
{
if(head->next==tail || head->next->next==tail)//如果头指针下来所指向为空
  return ;//返回上次调用的函数
  struct man * mid=head->next;//头指针后的一个
  struct man * p=head;
  struct man *q=mid
  char * pivot=mid->shengri;
  struct man * t=mid->next;
  whlie(t!=tail)
  {
         if(strcmp(t->shengri,pivot)>0)
         p=p->next=t;//改变头指针的指向,利用p进行遍历
         else
         q=q->next=t;
         t=t->next;遍历下面的指针
  }
  p->next=mid;//最后连接第二个结点
  q->next=tail;//最后一个结点为空
  quicksort(head,mid);//逐层遍历
  quicksort(mid,tail);
}
  1. 找鞍点(25 分)

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:

输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE

#include<stdio.h>
int main()
{
   int N;
   scanf("%d",&N);
   int M=N;//M,N表示矩阵的行和列
   int i,j,max,min,k,s,count=0;
   int a[20][20];//矩阵行列
   int b[N];//用来最大值的行数
   //count的作用是检查找没找到鞍点
   for(i=0;i<N;i++)
    for(j=0;j<N;j++)
      scanf("%d",&a[i][j]);
      //输入矩阵
      for(j=0;j<M;j++)
      {
         max=a[j][0];//令max为第一行第一个数
         for(i=0;i<N;i++)
           if(a[j][i]>max)
             max=a[j][i];//记录一行中的最大值
             s=0;//初始化b数组,s的值记录最大的值的个数,可以提高效率减少不必要的计算
             for(i=0;i<N;i++)
             if(a[j][i]==max)
             {
              b[s]=i;
              s++;//s的值就是最大的值的个数
              }
              min=max;//令min为max的值,可以直接比较有没有比最大的更小的值
              for(i=0;i<s;i++)//只需要在有最大值的列进行比较
              {
                for(k=0;k<M;k++)
                  if(min>a[k][b[i]])
                    break;
                    if(k==M)
                    {
                     printf(%d %d",j,b[i]);
                     count++;
                    }
             }
           }
      }
      if(count==0)
      printf("NONE\n");
      return 0;
}
  1. 单向链表2(25 分)

编程实现:输入一个正整数 repeat (0 < repeat < 10),做 repeat 次下列运算: 输入一个正整数 n(0 < n<=9)和一组(n个)整数,建立一个单向链表,再输入一个整数 x,将链表中最后一个与x相等的整数删除。

输入输出示例:括号内为说明
输入样例:

3 (repeat=3)
5 (数据的个数n=5)
1 2 4 3 7 (5个整数)
4 (待删除整数x=4)
5 (数据的个数n=5)
2 1 5 7 5 (5个整数)
5 (待删除整数x=5)
3 (数据的个数n=3)
1 2 4 (3个整数)
100 (待删除整数x=100)

输出样例:

size=4:1 2 3 7
size=4:2 1 5 7
size=3:1 2 4

这道题的思路并不难,就是链表的基本操作,可惜我上机没有重视

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct num
{
    int data;
    struct num *next;
};
struct num * create(int n)
{
    struct num * pHead,*p1,*p2;
   pHead=p1=(struct num *)malloc(sizeof(struct num));
   int x,i;
   for(i=0;i<n;i++)
   {
       scanf("%d",&x);
       p2=(struct num *)malloc(sizeof(struct num));
       p2->data=x;
       p1->next=p2;
       p1=p2;
   }
   return pHead;
}
void    print(struct num *pHead)
{
    struct num * pTemp;
    pTemp=pHead->next;
    while(pTemp)
    {
        printf("%d ",pTemp->data);
        pTemp=pTemp->next;
    }
    printf("\n");
}
struct num * Delete(struct num * pHead,int l)
{
  struct num *q,*pTemp;
  pTemp=pHead->next;
  q=pHead;
  while(pTemp)
  {
     if(pTemp->data==l)
     {
         q->next=pTemp->next;
         free(pTemp);
     }
     q=pTemp;
     pTemp=pTemp->next;
  }
  return pHead;
}
int main()
{
  struct num *pHead[10];
  int m,n,i,k;
  int j;
  scanf("%d",&m);
  for(i=0;i<m;i++)
  {  scanf("%d",&n);
     pHead[i]=create(n);
     scanf("%d",&k);
     pHead[i]=Delete(pHead[i],k);
  }
  for(j=0;j<i;j++)
      print(pHead[j]);
    return 0;
}

总结:这次期末机考的题目并不难,而我自己没有好好认真的对待,陷入了思维怪经,一直在向别的方法,而屏蔽了自己比较擅长的办法.从此之后应该多加练习.

猜你喜欢

转载自blog.csdn.net/dream0130__/article/details/81006532
今日推荐