c++敢死队问题代码(为大一而生)
有M個(gè)敢死隊(duì)員要炸掉敵人的一碉堡,誰(shuí)都不想去,排長(zhǎng)決定用輪回?cái)?shù)數(shù)的辦法來(lái)決定哪個(gè)戰(zhàn)士去執(zhí)行任務(wù)。如果前一個(gè)戰(zhàn)士沒(méi)完成任務(wù),則要再派一個(gè)戰(zhàn)士上去?,F(xiàn)給每個(gè)戰(zhàn)士編一個(gè)號(hào),大家圍坐成一圈,隨便從某一個(gè)戰(zhàn)士開(kāi)始計(jì)數(shù),當(dāng)數(shù)到5時(shí),對(duì)應(yīng)的戰(zhàn)士就去執(zhí)行任務(wù),且此戰(zhàn)士不再參加下一輪計(jì)數(shù)。如果此戰(zhàn)士沒(méi)完成任務(wù),再?gòu)南乱粋€(gè)戰(zhàn)士開(kāi)始數(shù)數(shù),被數(shù)到第5時(shí),此戰(zhàn)士接著去執(zhí)行任務(wù)。以此類(lèi)推,直到任務(wù)完成為止。
排長(zhǎng)是不愿意去的,假設(shè)排長(zhǎng)為1號(hào),請(qǐng)你設(shè)計(jì)一程序,求出從第幾號(hào)戰(zhàn)士開(kāi)始計(jì)數(shù)才能讓排長(zhǎng)最后一個(gè)留下來(lái)而不去執(zhí)行任務(wù)。
要求:至少采用三種不同的數(shù)據(jù)結(jié)構(gòu)的方法實(shí)現(xiàn)。
1.數(shù)組方法
#include<stdio.h>
struct some{
?? ?int num;};
?? ?
void search(int *b,int M){
?? ?int i,j=0,p=0;
?? ?while(M-p>1){
?? ? ? for(i=0;i<M;i++) ?
?? ??? ?if(*(b+i)!=0){
?? ??? ??? ?j++;
?? ??? ??? ?if(j%5==0){
?? ??? ??? ?p++; ?
?? ??? ??? ?*(b+i)=0;}
?? ??? ?} ?
?? ?}
?? ?for(i=0;i<M;i++) ? ??
?? ?if(*(b+i)!=0){
?? ??? ?int a=*(b+i);
?? ??? ?int b=M-a+2;
?? ??? ??? ?printf("從第%d個(gè)人開(kāi)始計(jì)數(shù)",b%M);}
}
int main(){
?? ?int M,i,q=1;
?? ?struct some a[100];?
?? ?printf("請(qǐng)輸入戰(zhàn)士人數(shù)M:");
?? ?scanf("%d",&M);
?? ?for(i=0;i<M;i++,q++)
?? ?a[i].num=q;
?? ?search(&a[0].num,M);
?? ?return 0;?
}
2.循環(huán)單鏈表
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node{
?? ?int data;
?? ?struct node *next ;
}LNode;
LNode *Creat(int n){
?? ?LNode *s,*q,*T;
?? ?int i;
?? ?if(n!=0){
?? ??? ?T=q=(LNode *)malloc(sizeof(LNode));
?? ??? ?q->data=1;
?? ??? ?for(i=2;i<=n;i++){
?? ??? ??? ?s=(LNode*)malloc(sizeof(LNode));
?? ??? ??? ?q->next=s;
?? ??? ??? ?q->next->data=i;
?? ??? ??? ?q=q->next;
?? ??? ?}?? ?
?? ??? ?q->next=T;
?? ?}
?? ?return T;}?
Delete (LNode *T){?
?? ?LNode *a;
?? ?int i;
?? ?while(T->next!=T){
?? ??? ?for(i=1;i<4;i++)
?? ??? ??? ?T=T->next;
?? ??? ?a=T->next;
?? ??? ?T->next=a->next;
?? ??? ?free(a);
?? ??? ?T=T->next ;
?? ?}
?? ?printf("\n");
?? ?return (T->data );
}
int main(){
?? ?int s,i,count=0;
?? ?LNode *p;
?? ?int z ,y,e=1,c=1,M;
?? ??? ?printf("請(qǐng)輸入敢死隊(duì)的人數(shù):");
?? ??? ?scanf("%d",&M);
?? ??? ?if(M<1){
?? ??? ??? ?printf("輸入有誤重新輸入\n1");
?? ??? ?}
?? ??? ??? ?else{
?? ??? ??? ?p=Creat(M);
?? ??? ??? ?y=Delete(p);
?? ??? ??? ?z=M-y+2;
?? ??? ??? ?if(z%M==0)
?? ??? ??? ??? ?printf("從第%d號(hào)開(kāi)始計(jì)數(shù)\n",z);
?? ??? ??? ?else
?? ??? ??? ??? ?printf("從第%d號(hào)開(kāi)始計(jì)數(shù)\n",(M-y+2)%M);}}
3.循環(huán)隊(duì)列
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define QueueSize 1000
typedef struct{
?? ?int data[QueueSize];
?? ?int front;
?? ?int rear;
?? ?int count;?
}SqQueue;
void Initial(SqQueue *Q)
{
?? ?Q->front=Q->rear=0;
?? ?Q->count=0;
}
int IsEmpty(SqQueue *Q)
{
?? ?return Q->front==Q->rear;
}
int Full(SqQueue *Q)
{
?? ?return Q->rear==QueueSize-1+Q->front;
}
void EnQueue(SqQueue *Q,int x)
{
?? ?if (Full(Q))
?? ?{
?? ??? ?printf("隊(duì)列上溢");?
?? ?}
?? ?Q->data[Q->rear]=x;?
?? ?Q->rear=(Q->rear+1)%QueueSize;?
?? ?Q->count ++;?
}
int DeQueue(SqQueue *Q)
{
?? ?int t;
?? ?if(IsEmpty(Q))
?? ?{
?? ??? ?printf("隊(duì)列為空");?
?? ?}
?? ?t=Q->data[Q->front];
?? ?Q->front=(Q->front+1)%QueueSize;?
?? ?Q->count--;?
?? ?return t;
}
int main()
{
?? ?int i,count=0,z,y,e=1,c=1,M,a,j;
?? ?SqQueue s;
?? ??? ?printf("請(qǐng)輸入敢死隊(duì)的人數(shù) :");
?? ??? ?scanf("%d",&M);
?? ??? ?for(a=1;a<=M;a++)
?? ??? ??? ?{
?? ??? ??? ??? ?Initial(&s);
?? ??? ??? ??? ?for(i=1;i<=M;i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?EnQueue(&s,i);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?for(i=1;i<a;i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?j=DeQueue(&s);
?? ??? ??? ??? ??? ?EnQueue(&s,j);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?count=1;
?? ??? ??? ??? ?while(count<M)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?for(i=1;i<5;i++)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?j=DeQueue(&s);
?? ??? ??? ??? ??? ??? ?EnQueue(&s,j);
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?j=DeQueue(&s);
?? ??? ??? ??? ?count++;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if(s.data[s.front]==1)
?? ??? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?printf("從第%d號(hào)開(kāi)始計(jì)數(shù)能讓排長(zhǎng)最后一個(gè)留下。",a);
}
4。三合一版本
#include<stdio.h>
#include<stdlib.h>
//敢死隊(duì)員結(jié)構(gòu)體
struct person{
? ? int flag;//0表示去執(zhí)行任務(wù)
};
int array() {
? ? int M, i;
? ? struct person persons[100];//敢死隊(duì)員數(shù)組,敢死隊(duì)員編號(hào)為數(shù)組下標(biāo)加1
? ? printf("請(qǐng)輸入敢死隊(duì)人數(shù): ");
? ? scanf("%d", &M);
? ? for (i = 0; i < M; i++){
? ? ? ? persons[i].flag = 1;
? ? }
? ? int cur=0;//當(dāng)前去執(zhí)行任務(wù)的人數(shù)
? ? int count=0;//計(jì)數(shù)
? ? //假設(shè)從1號(hào)開(kāi)始計(jì)數(shù)
? ? for (i = 0; cur<M-1; i++) {
? ? ? ? //從頭開(kāi)始計(jì)數(shù)
? ? ? ? if(i==M){
? ? ? ? ? ? i=0;
? ? ? ? }
? ? ? ? //如果當(dāng)前隊(duì)員沒(méi)有去執(zhí)行任務(wù)
? ? ? ? if(persons[i].flag==1){
? ? ? ? ? ? count++;
? ? ? ? ? ? //每次計(jì)數(shù)5次,令當(dāng)前隊(duì)員去執(zhí)行任務(wù)
? ? ? ? ? ? if(count%5==0){
? ? ? ? ? ? ? ? cur++;
? ? ? ? ? ? ? ? persons[i].flag=0;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? int result=0;
? ? //數(shù)組中只剩下一人沒(méi)去執(zhí)行任務(wù)
? ? for (i = 0; i < M; i++){
? ? ? ? if(persons[i].flag==1){
? ? ? ? ? ? result -= i;
? ? ? ? ? ? if(result<0){
? ? ? ? ? ? ? ? result += M;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? printf("從第%d個(gè)人開(kāi)始計(jì)數(shù)",result+1);
? ? return 0;
}
?//鏈表節(jié)點(diǎn)表示隊(duì)員
?struct node {
? ? int data;//隊(duì)員編號(hào)
? ? struct node *next;//指向下一個(gè)編號(hào)隊(duì)員
};
//假設(shè)從1號(hào)開(kāi)始計(jì)數(shù),返回最后一個(gè)留下的隊(duì)員編號(hào)
int fun(node *head, int M) {
? ? node *temp;
? ? int count;//計(jì)數(shù)
? ? int cur=0;//當(dāng)前執(zhí)行任務(wù)人數(shù)
? ? while (cur < M - 1) {
? ? ? ? for (count = 1; count < 4; count++)
? ? ? ? ? ? head = head->next;
? ? ? ? cur++;
? ? ? ? //刪除當(dāng)前節(jié)點(diǎn)
? ? ? ? temp = head->next;
? ? ? ? head->next = temp->next;
? ? ? ? free(temp);
? ? ? ? head = head->next;
? ? }
? ? return head->data;
}
int cycle_single_list() {
? ? node *head;//鏈表頭結(jié)點(diǎn)
? ? int M;
? ? printf("請(qǐng)輸入敢死隊(duì)的人數(shù):");
? ? scanf("%d", &M);
? ? //創(chuàng)建鏈表
? ? node *newNode, *pre;
? ? int i;
? ? head = pre = (node *) malloc(sizeof(node));
? ? pre->data = 1;
? ? for (i = 2; i <= M; i++) {
? ? ? ? newNode = (node *) malloc(sizeof(node));
? ? ? ? pre->next = newNode;
? ? ? ? pre->next->data = i;
? ? ? ? pre = pre->next;
? ? }
? ? pre->next = head;
? ? int id = fun(head, M);
? ? int result = 1 - (id - 1);
? ? if(result<1){
? ? ? ? result+=M;
? ? }
? ? printf("從第%d號(hào)開(kāi)始計(jì)數(shù)",result);
}
//隊(duì)列
typedef struct {
? ? int array[1000];//循環(huán)隊(duì)列數(shù)組
? ? int size;//循環(huán)隊(duì)列大小
? ? int front;//循環(huán)隊(duì)列頭部位置
? ? int back;//循環(huán)隊(duì)列尾部位置
} queue;
//入隊(duì)
void push(queue *a, int data) {
? ? a->array[a->back] = data;
? ? a->back = (a->back + 1) % 1000;
? ? a->size++;
}
//獲取隊(duì)首元素
int front(queue *a){
? ? return a->array[a->front];
}
//出隊(duì)
void pop(queue *a) {
? ? a->front = (a->front + 1) % 1000;
? ? a->size--;
}
//假設(shè)從1號(hào)開(kāi)始計(jì)數(shù),返回最后一個(gè)留下的隊(duì)員編號(hào)
int fun(queue *a) {
? ? int count;//計(jì)數(shù)
? ? while (a->size>1){
? ? ? ? for (count = 0; count < 4; count++) {
? ? ? ? ? ? int first= front(a);
? ? ? ? ? ? pop(a);
? ? ? ? ? ? push(a,first);
? ? ? ? }
? ? ? ? pop(a);
? ? }
? ? return front(a);
}
int cycle_queue() {
? ? int M;
? ? queue q;
? ? printf("請(qǐng)輸入敢死隊(duì)的人數(shù) :");
? ? scanf("%d", &M);
? ? //初始化隊(duì)列
? ? q.front=q.back=q.size=0;
? ? //創(chuàng)建隊(duì)列
? ? int i;
? ? for (i = 0; i < M; i++) {
? ? ? ? push(&q,i+1);
? ? }
? ? int id = fun(&q);
? ? int result = 1 - (id - 1);
? ? if(result<1){
? ? ? ? result+=M;
? ? }
? ? printf("從第%d號(hào)開(kāi)始計(jì)數(shù)",result);
}
int main() {
? ? int num;
? ? while (1) {
? ? ? ? printf("1.數(shù)組實(shí)現(xiàn)\n");
? ? ? ? printf("2.循環(huán)單鏈表實(shí)現(xiàn)\n");
? ? ? ? printf("3.循環(huán)隊(duì)列實(shí)現(xiàn)\n");
? ? ? ? scanf("%d", &num);
? ? ? ? if (num == 0) {
? ? ? ? ? ? printf("輸入錯(cuò)誤,請(qǐng)重試\n");
? ? ? ? } else if(num == 1) {
? ? ? ? ? ? return array();
? ? ? ? } else if(num == 2) {
? ? ? ? ? ? return cycle_single_list();
? ? ? ? } else if(num == 3) {
? ? ? ? ? ? return cycle_queue();
? ? ? ? }
? ? }
}
總結(jié)
以上是生活随笔為你收集整理的c++敢死队问题代码(为大一而生)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 因特网中的域名服务器系统负责全网IP,因
- 下一篇: Conflux CTO伍鸣博士应邀出席金