| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 759 人关注过本帖, 1 人收藏
标题:一个关于出列游戏编程的问题!敬请指点!
只看楼主 加入收藏
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
回复 7楼 遗矢的老人
生活中很多故事或者情景都可以用编程来说明问题,这就是思想。为什么人类能统治世界?就是因为人类会思考问题,会研究问题。牛顿为什么会成为科学家?就是因为被苹果砸的!被苹果砸了又怎样?可贵的就是这不是一个一般的苹果,是乔布斯的苹果,他没有吃掉这个苹果,而是从这个苹果中得出了伟大的万有引力定律,一举成名,一发不可收拾!给我个杠杆,我可以翘起整个地球,这可不是吹的!

[ 本帖最后由 小小战士 于 2012-11-10 21:50 编辑 ]

小小战士,战士中的战斗机!
2012-11-10 21:48
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:2 
程序代码:
#include<stdio.h>
#include<malloc.h>
struct lz
{
    int num;
    int mima;
    int flag;
    struct lz *next;  /*定制结构体*/
};
struct lz *lianbiao(int mim[5])
{
    struct lz *head,*p,*q;
    int i=1;
    head=NULL;
    p=q=(struct lx*)malloc(sizeof(struct lz));
    head=p;
    p->num=i;p->flag=1;p->mima=mim[i-1];
    do
    {   i++;
        q=(struct lz*)malloc(sizeof(struct lz));
        p->next=q;
        p=q;
        q->num=i;q->flag=1;q->mima=mim[i-1];

    }   ?*定制链表并赋值*/
    while(i<5);
    p->next=head;
    return head;/*返回头指针*/

}
main()
{
    struct lz *p,*q;
    int i=1,j=0,m;/*q用来保存头指针,q用来循环*/
    int mim[]={2,3,5,1,3};/*i记录循环次数,j记录出局者个数,m存放密码*/
    q=lianbiao(mim);
    p=q;
    m=p->mima;
    do
    {
        if(i==m)
        {   printf("%d\n",p->num);
            p->flag=0;m=p->mima;j++;i=1;p=p->next;
        }
        if(p->flag==0)
        p=p->next;
        else
        {i++;
        p=p->next; }

     }while(j!=4); /*已经出局4个后剩一个不能循环,跳出*/
     p=q;
     for(i=1;;i++)
     {
        if(p->flag!=0)
        {printf("%d",p->num);break;}
        else
        {p=p->next;}  /*显示最后一个*/
     }
    return 0;


}
做了下,不知道是不是楼主想要的那样


本人新手,说错勿怪。。。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-10 23:19
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
楼主的代码最后
 else
        {
            p=p->next;//下一个人
            if(p->flag==1)//没退出的人报数,退出的人不报数
            i++;
}
这部分我认为有点小问题,p=p->next;
是不是放在i++后边好点呀。。。



本人新手,说错勿怪。。。。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-10 23:46
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
此程序成功告破,感谢各位的大力相助!辛苦辛苦!感激不尽!
下面与大家分享一下!

/*本程序简介:
 *    编号为1~x的x个人围坐一圈,每人持有各自的密码(一个正整数),开始时选取一号的密码从一号开始循环报数(1~M),
 *    报到M(M为这个密码的值)的人退出,将退出人的密码作为新的M值,下一个没退出的人继续从一开始报数,如此下去,
 *    直到所有人全部退出游戏,求出列顺序(按编号排列)!
 *测试数据:
 *    如果1~3号密码依次为1,2,3,则出队顺序按编号排列依次为1,2,3;
 *    如果1~4号密码依次为2,3,5,1,则出队顺序按编号排列依次为2,1,4,3;
 *    如果1~5号密码依次为3,6,2,4,5,则出队顺序按编号排列依次为3,5,2,1,4;
 *    如果1~6号密码依次为2,4,4,2,5,3,则出队顺序按编号排列依次为2,6,4,1,5,3;
 *    如果1~7号密码依次为4,2,3,3,6,6,5,则出队顺序按编号排列依次为4,7,6,2,5,3,1;
 *    如果1~8号密码依次为3,2,5,4,1,1,4,6,则出队顺序按编号排列依次为3,8,7,5,6,1,2,4;
 */

程序代码如下:
#include<stdio.h>
#include<malloc.h>
//定义结构体,成员变量存放标志位、编号、密码、下一节点地址
typedef struct node
{
    int flag;
    int num;
    int mima;
    struct node *next;
}node;
//创建循环单向链表
node *create_list(node *head,int str[],int x)
{
    int i;
    node *p,*q;
    head=(node *)malloc(sizeof(node));
    for(i=0;i<x;i++)
    {
        p=(node *)malloc(sizeof(node));
        p->flag=1;
        p->num=i+1;
        p->mima=str[i];
        p->next=NULL;
        if(i==0)
        {
            head=p;
        }
        else
        {
            q->next=p;
        }
        q=p;
    }
    q->next=head;//循环链表
    return head;
}
int main()
{
    int str[]={3,2,5,4,1,1,4,6};//密码,多少个密码就有多少个人参加游戏,此处密码可随意更改增删
                                //如果改密码或者增删人数,只要修改这里即可
    node *head=NULL;
    node *p=NULL;
    int x;
    x=sizeof(str)/sizeof(str[0]);//x为参加游戏的人数
    head=create_list(head,str,x);
    printf("编号:");//打印编号
    p=head;
    do
    {
        printf("%d ",p->num);
        p=p->next;
    }while(p!=head);
    printf("\n");
    printf("密码:");//打印对应密码
    p=head;
    do
    {
        printf("%d ",p->mima);
        p=p->next;
    }while(p!=head);
    printf("\n");
    /*标志为1表示没退出,标志为0表示退出*/
    printf("标志:");//打印初始标志,确认所有人都没有退出
    p=head;
    do
    {
        printf("%d ",p->flag);
        p=p->next;
    }while(p!=head);
    printf("\n");

    /*实现过程如下*/
    p=head;
    int i=1;
    int e=head->mima;//从1号开始循环报数
    printf("出队顺序:\n");
    while(1)
    {
        if(i==e)//如果报数M
        {
            printf("编号:%-3d 对应密码:%-3d\n",p->num,p->mima);//打印退出人的编号和密码
            p->flag=0;//标志为1表示没退出,标志为0表示退出
            i=1;//i从1开始
            e=p->mima;//密码为退出人的密码
            x--;//退出
            if(x==0)//如果所有人都退出,结束游戏
            break;//跳出循环
            while(p->next->flag==0)//找到下一个没有退出的人
            p=p->next;
            p=p->next;//p指向下一个没有退出的人
        }
        else
        {
                while (p->next->flag==0)//找到下一个没有退出的人
                p=p->next;
                p=p->next;//p指向下一个没有退出的人
                i++;//报数加一
        }
    }
    return 0;//程序结束
}

程序执行结果如下:
_________________________________________________________________________________
编号:1 2 3               |   编号:1 2 3 4             |   编号:1 2 3 4 5         |
密码:1 2 3               |   密码:2 3 5 1             |   密码:3 6 2 4 5         |
标志:1 1 1               |   标志:1 1 1 1             |   标志:1 1 1 1 1         |
出队顺序:                |   出队顺序:                |   出队顺序:              |
编号:1   对应密码:1      |   编号:2   对应密码:3      |   编号:3   对应密码:2    |
编号:2   对应密码:2      |   编号:1   对应密码:2      |   编号:5   对应密码:5    |
编号:3   对应密码:3      |   编号:4   对应密码:1      |   编号:2   对应密码:6    |
                         |   编号:3   对应密码:5      |   编号:1   对应密码:3    |
                         |                            |   编号:4   对应密码:4    |
_________________________|____________________________|__________________________|
编号:1 2 3 4 5 6         |   编号:1 2 3 4 5 6 7       |   编号:1 2 3 4 5 6 7 8   |
密码:2 4 4 2 5 3         |   密码:4 2 3 3 6 6 5       |   密码:3 2 5 4 1 1 4 6   |
标志:1 1 1 1 1 1         |   标志:1 1 1 1 1 1 1       |   标志:1 1 1 1 1 1 1 1   |
出队顺序:                |   出队顺序:                |   出队顺序:              |
编号:2   对应密码:4      |   编号:4   对应密码:3      |   编号:3   对应密码:5    |
编号:6   对应密码:3      |   编号:7   对应密码:5      |   编号:8   对应密码:6    |
编号:4   对应密码:2      |   编号:6   对应密码:6      |   编号:7   对应密码:4    |
编号:1   对应密码:2      |   编号:2   对应密码:2      |   编号:5   对应密码:1    |
编号:5   对应密码:5      |   编号:5   对应密码:6      |   编号:6   对应密码:1    |
编号:3   对应密码:4      |   编号:3   对应密码:3      |   编号:1   对应密码:3    |
                         |   编号:1   对应密码:4      |   编号:2   对应密码:2    |
                         |                            |   编号:4   对应密码:4    |
_________________________|____________________________|__________________________|

[ 本帖最后由 小小战士 于 2012-11-11 02:07 编辑 ]

小小战士,战士中的战斗机!
2012-11-11 01:06
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
g恭喜恭喜

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-11 08:29
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
同喜同喜

小小战士,战士中的战斗机!
2012-11-22 12:25
快速回复:一个关于出列游戏编程的问题!敬请指点!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031981 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved