回 帖 发 新 帖 刷新版面

主题:[讨论]报数游戏

报数游戏:a,b,c,d,e,f,g,h8人站成一排,如图所示报数,任意输入一个正整数,谁报到该数?
A    B    C    D    E    F    G    H
1    2    3    4    5    6    7    8
15   14   13   12   11   10   9
     16   17   18   19   20   21  22
29   28   27   26   25   24   23
     30   31   32   33   34   35  36
?????????!!!!!!!!
 
[em18][em1]

回复列表 (共12个回复)

沙发

很好,用循环链表可以实现.

板凳

input N
Print Mid$("ABCDEFGH", 2+((N-2) Mod 7)*(1-2*(((N-2)\7) Mod 2))+5*(((N-2)\7) Mod 2),1)

3 楼

程序呀!!!
最好再给个解题思路!

4 楼

30分满分你居然才给我10分,
不是因为我闷得发疯我才懒得理你.

首先先来分析一下问题:
1.注意看一下,除第一行外,其余每行7个数字,这很重要,先捡到一个规律先.
2.注意看奇偶行的方向不同,这很重要,又是一个解决问题的利剑.
来解决一下问题,
1. N 是求值
   因为第一行有8个数,设一变量M=N-1
   规律于是变成了:(忽略顺序)
   01234567
    89 10 11 12 13 14......
   每行七个数,为了搞清楚这个N在哪一行,于是
2. H=(M-1)\7
   H就是行数,从0行开始,于是I=H mod 2就知道N是奇数行还是偶数行了.
   是顺向,还是逆向,也就知道了.
3. 字母顺序就是ABCDEFGH,但到底是哪个位置呢?
   从每行7个数和顺逆向可以得知具体位置, mod 7 就知道位置了.分析一下具体的余数
   按N mod 7来看:
   1 2 3 4 5 6 0 1   奇数行 (第一个数可以忽略)
     1 0 6 5 4 3 2     偶数行 有规律就可以推算出位置来.
4. 既然有规律,那就好办了.开始编程

[color=0000ff]
input N
M=N-1
H=(M-1)\7    '整除
I=H mod 2    '奇偶数行
if I=0 then  
   S=((N-2) mod 7)+2          '奇数行,根据规律把N换算成位置
else
   S=7-((N-2) mod 7)          '偶数行,把N换算成位置
endif 
Print mid$("ABCDEFGH",S,1)
[/color]

我把这一大段代码弄成一行,
可以一定程度的加快计算速度(特别是庞大循环的时候)
但你居然才给我10分,太让我伤心了.
我虽不在乎收益,但却在乎承认啊.

5 楼


[em10][em10][em10]

6 楼

不好意思,本人刚来,第一次发贴。当天查看的时候又是迷迷糊糊的,就随便点了个10分就转头去睡觉了,没仔细看程序。
今天查看时将所有回帖都仔仔细细地看了一遍,才察觉你的第一个回帖不错,但是已经晚了……
谢谢你在第二次回帖的时候把整个题目讲解了一遍,我明白了。居然比我们老师的程序还简单!!!
虽然想给你加50分作为上次的补偿和这次的回报,但系统不允许,不能怪我。

7 楼

我在3楼是对wwjxjj说的!

8 楼

你啥意思?

9 楼

对wwjxjj说:“你啥意思?”

10 楼

我刚自学的链表数据结构,正好你的题目可以拿来练。
你的题目可用双向链表实现。
(思路是:指针从表头到表尾往复搜索,当指针移动累计的数字等于你要求的数时读出指针所指的值)
下面是双向链表的C++描述:(我已经测试过证明完全正确)

#include "stdafx.h"
#include "iostream.h"

struct MYLINK
{
    char data;
    MYLINK *prior,*next;
}*head,*s,*end;  //头指针,搜索指针,尾指针

void CreatLink(int n);  //建立链表
MYLINK *Show();  //显示链表
int  Search(int n);  //开始报数

int main(int argc, char* argv[])
{
    cout<<"===========报数游戏============="<<endl;
    cout<<"开始构建链表"<<endl;
//建立链表
    CreatLink(8);   //建立有8个节点的链表
    cout<<"构建完毕!"<<endl;    
//输出链表
    cout<<"输出链表值:"<<endl;
    Show(); 
//开始报数
    cout<<"输入数字:"<<endl;
    int n;
    cin>>n;
    char f=Search(n);
    cout<<f<<"报到了这个数!"<<endl;
    return 0;
}

void CreatLink(int n)
{    
    head=end=new MYLINK;  //产生表头监督元节点
    MYLINK *p;  //新节点指针

    char s[8]={'A','B','C','D','E','F','G','H'};
    for(int i=1;i<=n;i++)
    {
    p=new MYLINK;  
    p->data =s[i-1];  //新节点值
       //插在表尾处
    end->next =p;  
    p->prior =end;
    end=end->next;  //移动表尾指针
    }
    p->next =NULL;  //尾指针置空
}

MYLINK *Show()
{
    s=head;  //从表头开始

    while(s->next !=NULL)  
    {
        s=s->next ;  //移动搜索指针
        cout<<s->data<<endl;  //输出指针所指的值
    }
    return head;  //返回表头指针
}

int Search(int n)
{
    int add=1;  //指针移动累加值
    bool z=true;  //用于判断指针下移还是上移
    s=head;  //搜索指针从表头开始

    while(true)
    {
        if(z)  //指针下移
        {
        s=s->next;
        if(s->next ==NULL){z=false;}
        }
        else  //指针上移
        {
        s=s->prior;
               if(s->prior ==head){z=true;}
        }
               if(add ==n){return s->data;}  //输出!
        add++;
    }
    return -1;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册