本次机考我考了0分,这是很丢人的成绩。我对此深深的反思,在自己曾经做过的题错的多么离谱。
自己最近的态度及其懒散,每天抱着手机,也不好好认真的学习
‘1. 输出全排列(25 分)
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1,a2,⋯,an排在序列b1,b2,⋯,bn之前,如果存在k使得a1=b1,⋯,ak=bk 并且 ak+1< bk+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个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入格式:
输入第一行给出正整数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);
}
- 找鞍点(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;
}
- 单向链表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;
}
总结:这次期末机考的题目并不难,而我自己没有好好认真的对待,陷入了思维怪经,一直在向别的方法,而屏蔽了自己比较擅长的办法.从此之后应该多加练习.