主题:[讨论]报数游戏
木偶之舞
[专家分:60] 发布于 2007-12-25 21:26:00
报数游戏: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个回复)
沙发
wwjxjj [专家分:760] 发布于 2007-12-26 14:01:00
很好,用循环链表可以实现.
板凳
moz [专家分:37620] 发布于 2007-12-26 15:49:00
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 楼
木偶之舞 [专家分:60] 发布于 2007-12-26 22:18:00
程序呀!!!
最好再给个解题思路!
4 楼
moz [专家分:37620] 发布于 2007-12-27 13:24:00
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 楼
wwjxjj [专家分:760] 发布于 2007-12-28 19:36:00
[em10][em10][em10]
6 楼
木偶之舞 [专家分:60] 发布于 2007-12-28 21:05:00
不好意思,本人刚来,第一次发贴。当天查看的时候又是迷迷糊糊的,就随便点了个10分就转头去睡觉了,没仔细看程序。
今天查看时将所有回帖都仔仔细细地看了一遍,才察觉你的第一个回帖不错,但是已经晚了……
谢谢你在第二次回帖的时候把整个题目讲解了一遍,我明白了。居然比我们老师的程序还简单!!!
虽然想给你加50分作为上次的补偿和这次的回报,但系统不允许,不能怪我。
7 楼
木偶之舞 [专家分:60] 发布于 2007-12-28 21:07:00
我在3楼是对wwjxjj说的!
8 楼
木偶之舞 [专家分:60] 发布于 2007-12-28 21:08:00
你啥意思?
9 楼
木偶之舞 [专家分:60] 发布于 2007-12-28 21:09:00
对wwjxjj说:“你啥意思?”
10 楼
wwjxjj [专家分:760] 发布于 2007-12-29 14:43:00
我刚自学的链表数据结构,正好你的题目可以拿来练。
你的题目可用双向链表实现。
(思路是:指针从表头到表尾往复搜索,当指针移动累计的数字等于你要求的数时读出指针所指的值)
下面是双向链表的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;
}
我来回复