魔术师发牌问题
本帖最后由 冰逸琉璃 于 2021-6-8 07:19 编辑就是术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下,魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A, 将黑桃A放到桌面上,第二次数1,2将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2, 也将它放在桌子上这样依次进行将13张牌全部翻出,准确无误。我是这样写的,感觉没有错误,但是运行出来不对,看了一天也没看出那错了,请教下大佬们{:5_96:}
#include <stdio.h>
#include <stdlib.h>
#define MAX 13
typedef struct node
{
int num;
struct node* next;
}node;
node* initialization();//创建循环链表
void sort(node* p);//排序牌顺序
node* initialization()//创建链表
{
node* head = NULL;
node* s;//节点
node* r = NULL;//指向最后一个节点
for (int i = 0; i < MAX; i++)
{
s = (node*)malloc(sizeof(node));
if (s == NULL)
{
exit(1);
}
s->num = 0;
if (head == NULL)
{
head = s;
s->next = head;
r = head;
}
else
{
r->next = s;
s->next = head;
r = s;
}
}
return head;
}
void sort(node* p)//排序牌顺序
{
node* head = p;
int number = 2;
int j;
head->num = 1;
while (1)
{
for (j = 0; j < number; j++)
{
head = head->next;
if (head->num != 0)
{
head = head->next;
j--;
}
}
head->num = number++;
if (number == MAX + 1)
{
break;
}
}
}
int main(void)
{
node* p;
p = initialization();
sort(p);
for (int i = 0; i < MAX; i++)
{
printf("%d ", p->num);
p = p->next;
}
return 0;
} 类似这样的代码,没有意义,什么事情也不做
#include <stdio.h>
int main(void) {
1;
2;
3;
100;
;
;
int i = 100;
i + 1;
i;
printf("%d\n", i);
printf("hello world!\n");
return 0;
}
代码在哪里 截图太糊了
复制过来呀 万千只cnm 发表于 2021-6-7 21:28
截图太糊了
复制过来呀
嗷嗷 你这个程序使用的是什么样的算法?
这个程序再我看来,使用递归的思想是不错的
首先把已经摆好的牌从上到下编号
要想摆好第1张,先要把第2张摆好,第2张要求先摆第3张
也就是先摆第13张然后是第12张。。。然后是第2张,然后是第1张
应该是倒着来的
完全就是取牌时候的反向操作
#include <iostream>
#include <list>
std::ostream &operator<<(std::ostream &os, const std::list<size_t> &rhs) {
for(const auto &i: rhs) os << i << " ";
return os;
}
int main() {
std::list<size_t> list;
for(size_t i = 13; i > 0; --i) {
list.push_front(i);
for(size_t j = 1; j < i; ++j) {
size_t temp = list.back();
list.pop_back();
list.push_front(temp);
}
}
std::cout << list << std::endl;
return 0;
}
人造人 发表于 2021-6-8 10:40
你这个程序使用的是什么样的算法?
这个程序再我看来,使用递归的思想是不错的
首先把已经摆好的牌从上到 ...
我这么想的,首先在位置1上放第一张牌,把number初始化为2(用来计下一次要走的步数),进入for循环 (j = 0; j < number ; j++) 后也就是走两步,if判断到这个位置已经放过牌的话j-1,然后再往前走一步,走完后让number加1,然后在这个位置上放牌 。可能我表达的不是太清楚{:5_99:} 冰逸琉璃 发表于 2021-6-8 16:21
我这么想的,首先在位置1上放第一张牌,把number初始化为2(用来计下一次要走的步数),进入for循环 (j = 0 ...
看不懂你的想法,我认为你的方法无法实现这个题目要求
要想摆好第1张,先要把第2张摆好,第2张要求先摆第3张
也就是先摆第13张然后是第12张。。。然后是第2张,然后是第1张
我认为应该是倒着来的
我不知道怎样才能正着摆好所有的牌
你第1张牌应该摆在哪里?不知道吧?应该把第2张牌先摆好才能摆第1张牌吧?
人造人 发表于 2021-6-8 17:58
看不懂你的想法,我认为你的方法无法实现这个题目要求
要想摆好第1张,先要把第2张摆好,第2张要求先摆 ...
改了这个地方以后好像就没问题了,之前应该是把Nhead->next写成Nhead=Nhead->next。
我现在就是还不理解这个Nhead->next是什么意思,和Nhead=Nhead->next有什么区别
#include <stdio.h>
#include <stdlib.h>
#define MAX 13
typedef struct node
{
int num;
struct node* next;
}node;
node* initialization();
void sort(node* head);
node* initialization()
{
node* head = NULL;
node* s;
node* r = NULL;
for (int i = 0; i < MAX; i++)
{
if (head == NULL)
{
head = (node*)malloc(sizeof(node));
if (head == NULL)
{
exit(1);
}
head->num = 0;
head->next = head;
r = head;
}
else
{
s = (node*)malloc(sizeof(node));
if (s == NULL)
{
exit(1);
}
s->num = 0;
r->next = s;
s->next = head;
r = s;
}
}
return head;
}
void sort(node* head)
{
node* Nhead = head;
int number = 2;
int j;
Nhead->num = 1;
while (1)
{
for (j = 0; j < number; j++)
{
Nhead = Nhead->next;
if (Nhead->num != 0)
{
Nhead->next;//改了这里
j--;
}
}
if (Nhead->num == 0)
{
Nhead->num = number++;
if (number == MAX + 1)
{
break;
}
}
}
}
int main(void)
{
node* head = NULL;
head = initialization();
sort(head);
for (int i = 0; i < MAX; i++)
{
printf("%d ", head->num);
head = head->next;
}
return 0;
} 人造人 发表于 2021-6-8 17:58
看不懂你的想法,我认为你的方法无法实现这个题目要求
要想摆好第1张,先要把第2张摆好,第2张要求先摆 ...
依旧是从第一张开始排的{:10_266:} 冰逸琉璃 发表于 2021-6-8 19:57
依旧是从第一张开始排的
Nhead->next;//改了这里
这条语句没有意义,这条语句什么也不做,去掉也完全没问题
人造人 发表于 2021-6-8 20:03
类似这样的代码,没有意义,什么事情也不做
哈哈哈,懂了 ,万分感谢,突然感觉好丢人,就这么点事还来问{:10_266:}
页:
[1]