目录
1748约瑟夫问题
描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0
输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入
6 2 12 4 8 3 0 0
样例输出
5 1 7
这一题我采用的是 循环队列(模板):相关内容链接
思路:编号1-n放入到一个队列中,然后从队首中依次取出一个编号,如果取出的编号是第m个,则不放入队列尾部,进行出队。反之则放入队列尾部,一直这样循环,直到队列里面只剩下一个,那么就得到这个编号的猴子就是猴王。
#include<iostream>
using namespace std;
const int Queuesize = 400;
template <class T>
class CirQueue
{
private:
T* data;
int front;
int rear;
int num;
int m_Size;
public:
CirQueue(); //建立缺省长度(QueueSize )的队列
CirQueue(int m_size); //建立长度为size的队列
~CirQueue(); //清空队列,释放内存
bool enQueue(T item); //入队
bool deQueue(T* item); //出队
bool getFront(T* item); //读取队头元素,但不删除
bool isEmpty(); //判断队列是否为空
bool isFull(); //判断队列是否为满
void clearQueue(); //清空队列
void displayQueue(); //显示队列内容
int queueLength(); //获取队列元素个数
};
template<class T>
CirQueue<T>::CirQueue(int Size)
{
num = 0;
front = rear = -1;
data = new T[Size];
m_Size = Size;
}
template<class T>
CirQueue<T>::~CirQueue()
{
clearQueue();
}
template<class T>
bool CirQueue<T>::enQueue(T item)
{
if (isFull()) return 0;
else
{
rear = (rear + 1) % m_Size;
data[rear] = item;
num++;
return 1;
}
}
template<class T>
bool CirQueue<T>::deQueue(T* item)
{
if (isEmpty()) return 0;
else
{
front = (front + 1) % m_Size;
*item = data[front];
num--;
return 1;
}
}
template<class T>
bool CirQueue<T>::getFront(T* item)
{
int i;
if (isEmpty()) return 0;
i = (front + 1) % m_Size;
*item = data[i];
return 1;
}
template<class T>
bool CirQueue<T>::isEmpty()
{
if (num == 0) return 1;
else return 0;
}
template<class T>
bool CirQueue<T>::isFull()
{
if (num == m_Size) return 1;
else return 0;
}
template<class T>
void CirQueue<T>::clearQueue()
{
delete[]data;
}
template<class T>
void CirQueue<T>::displayQueue()
{
int i = (front + 1) % m_Size;
cout << "队列从队首到队尾数据依次为:" << endl;
for (; i <m_Size; i++)
{
cout << " " << data[i] << " " << endl;
}
}
template<class T>
int CirQueue<T>::queueLength()
{
return num;
}
int main()
{
int n;
int m;
int count = 1;
int temp = 0;
int flag;
int king = 0;
int i = 0;
int KING[Queuesize] = {0};
while (1)
{
cin >> n >> m;
CirQueue<int>p1(n);
if (n == 1)
{
KING[i] =1;
i++;
}
else if (n == 0 && m == 0)
break;
else
{
while (count <= n)
{
p1.enQueue(count);
count++;
}
count = 1;
//p1.displayQueue();
while (p1.queueLength() != 1)
{
if (count != m)
{
flag = p1.deQueue(&temp);
count++;
flag = p1.enQueue(temp);
}
else
{
flag = p1.deQueue(&temp);
count = 1;
}
}
flag = p1.getFront(&king);
KING[i] = king;
i++;
//cout << p1.queueLength() << endl;
}
}
int j = 0;
for (j = 0; j < i; j++)
cout << KING[j] << endl;
return 0;
}
6378删除数组中的元素(链表)
描述
给定N个整数,将这些整数中与M相等的删除
假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3
应该将其放在一个链表中,链表长度为20
要删除的数是3,删除以后,链表中只剩14个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9
要求:必须使用链表,不允许使用数组,也不允许不删除元素直接输出
程序中必须有链表的相关操作:建立链表,删除元素,输出删除后链表中元素,释放链表
不符合要求的程序即使通过,也会算作0分
输入
输入包含3行:
第一行是一个整数n(1 <= n <= 200000),代表数组中元素的个数。
第二行包含n个整数,代表数组中的n个元素。每个整数之间用空格分隔;每个整数的取值在32位有符号整数范围以内。
第三行是一个整数k,代表待删除元素的值(k的取值也在32位有符号整数范围内)。
输出
输出只有1行:
将数组内所有待删除元素删除以后,输出数组内的剩余元素的值,每个整数之间用空格分隔。
样例输入
20 1 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 3 3
样例输出
1 0 -3 5 6 8 10 22 -1 5 11 20 100 9
#include<iostream>
#include<string>
using namespace std;
int count;
struct student
{
int s;
};
typedef struct node
{
struct student data;
struct node* next;
}Node, * Link;
void addNode(Link head, int n)
{
Link rear = head;
int i=0;
while (i < n)
{
Link node = new Node;
node->next = NULL;//初始化node的next指针,确保输出时能结束;
cin >> node->data.s;
rear->next = node;
rear = node;
i++;
}
}
void deleteNode(Link head,int m)
{
Link p = head->next;
Link q = head;
while (p != NULL)
{
if (p->data.s == m)
{
q->next = p->next;
delete p;
p = q->next;
}
else
{
q = p;
p = p->next;
}
}
}
void showLink(Link head)
{
Link p = head->next;
while (p != NULL)
{
cout << p->data.s << " " ;
p = p->next;
}
}
int main()
{
int n=0;
cin >> n;
Link head;
head = new Node;
head->next = NULL;
addNode(head,n);
int m;
cin >> m;
deleteNode(head, m);
showLink(head);
delete head;
return 0;
}
6379统计学生信息(使用动态链表完成)
描述
利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址)
其中,学号长度不超过20, 姓名长度不超过40, 性别长度为1, 地址长度不超过40
输入
包括若干行,每一行都是一个学生的信息,如:
00630018 zhouyan m 20 10.0 28#460
输入的最后以"end"结束
输出
将输入的内容倒序输出
每行一条记录,按照
学号 姓名 性别 年龄 得分 地址
的格式输出
样例输入
00630018 zhouyan m 20 10 28#4600 0063001 zhouyn f 21 100 28#460000 0063008 zhoyan f 20 1000 28#460000 0063018 zhouan m 21 10000 28#4600000 00613018 zhuyan m 20 100 28#4600 00160018 zouyan f 21 100 28#4600 01030018 houyan m 20 10 28#4600 0630018 zuyan m 21 100 28#4600 10630018 zouan m 20 10 28#46000 end
样例输出
10630018 zouan m 20 10 28#46000 0630018 zuyan m 21 100 28#4600 01030018 houyan m 20 10 28#4600 00160018 zouyan f 21 100 28#4600 00613018 zhuyan m 20 100 28#4600 0063018 zhouan m 21 10000 28#4600000 0063008 zhoyan f 20 1000 28#460000 0063001 zhouyn f 21 100 28#460000 00630018 zhouyan m 20 10 28#4600
#include<iostream>
#include<string>
using namespace std;
int count = 0;
struct student
{
string no;
string name;
char sex;
int age;
double socre;
string address;
};
typedef struct node
{
struct student data;
struct node* next;
}Node, * Link;
void addNode(Link head)
{
Link p;
Link node;
while (1)
{
node = new Node;
cin >> node->data.no;
if (node->data.no == "end")
break;
else
{
cin >> node->data.name;
cin >> node->data.sex;
cin >> node->data.age;
cin >> node->data.socre;
cin >> node->data.address;
p = head->next;
node->next = p;
head->next = node;
}
}
}
void showLink(Link head)
{
Link p;
p = head->next;
while (p!=NULL)
{
cout << p->data.no << " " << p->data.name << " " << p->data.sex << " " << p->data.age << " " << p->data.socre << " " << p->data.address << endl;
p = p->next;
}
}
int main()
{
Link head;
head = new Node;
head->next = NULL;
addNode(head);
showLink(head);
delete head;
return 0;
}