现在的位置: 首页 > 13 数据结构入门 > 基础课程 > 正文

卡片游戏

2011年05月10日 13 数据结构入门, 基础课程 ⁄ 共 359字 ⁄ 字号 暂无评论

队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#define MAXN 10000+10
int q[MAXN];
 
int main(int argc, char *argv[])
{
    int i, n, front, rear;
 
    scanf("%d", &n);
    for (i=0; i<n; i++)
        q[i] = i+1;
    front = 0;  rear = n;
    while (n>0) {
        printf("%d ", q[front]);
        front++;
        q[rear] = q[front];
        rear++;  front++;
        n--;
    }
    return 0;
}

这段代码可以做两方面的优化:

1
2
队列为空: front = rear; 队列不空 front < rear
i++ 的优化

卡片游戏优化后的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#define MAXN 10000+10
int q[MAXN];
 
int main(int argc, char *argv[])
{
    int i, n, front, rear;
 
    scanf("%d", &n);
    for (i=0; i<n; i++)
        q[i] = i+1;
    front = 0; rear = n;
    while (front<rear) {
        printf("%d ", q[front++]);
        q[rear++] = q[front++];
    }
 
    return 0;
}

使用C++来实现

C++的模板如下:

1
2
3
4
5
6
7
8
9
#include <cstdio>
 
using namespace std;
 
int main(int argc, char *argv[])
{
 
    return 0;
}

C++提供了一种更加简单的处理方式 STL 队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
#include <queue>
using namespace std;
 
queue<int> q;
 
int main(int argc, char *argv[])
{
    int i, n;
 
    scanf("%d", &n);
    for (i=0; i<n; i++)
        q.push(i+1);  
    while (!q.empty()) {
        printf("%d ", q.front());
        q.pop();
        q.push(q.front());
        q.pop();
    }
 
    return 0;
}

如何处理有n组数呢?

1
2
3
4
5
    scanf("%d", &t);
    while (t-->0) {
 
 
    }

核心代码

1
2
3
4
5
6
7
8
9
    scanf("%d", &n);
    for (i=0; i<n; i++)
        q[i] = i+1;
    front = 0; rear = n;
    while (front<rear) {
        printf("%d ", q[front++]);
        q[rear++] = q[front++];
    }
    printf("\n");

请把这两段代码合并后,再进行 C/C++代码格式化

下面的代码能够处理 t 组数据了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#define MAXN 10000+10
int q[MAXN];
 
int main(int argc, char *argv[])
{
    int i, n, t, front, rear;
 
    scanf("%d", &t);
    while (t-->0) {
        scanf("%d", &n);
        for (i=0; i<n; i++)
            q[i] = i+1;
        front = 0;  rear = n;
        while (front<rear) {
            printf("%d ", q[front++]);
            q[rear++] = q[front++];
        }
        printf("\n");
    }
    return 0;
}

能够处理 t 组数的C++程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <cstdio>
#include <queue>
using namespace std;
 
queue<int> q;
 
int main(int argc, char *argv[])
{
    int i, n, t;
 
    scanf("%d", &t);
    while (t-->0) {
        scanf("%d", &n);
        for (i=0; i<n; i++)
            q.push(i+1);
        while (!q.empty()) {
            printf("%d ", q.front());
            q.pop();
            q.push(q.front());
            q.pop();
        }
        printf("\n");        
    }
 
    return 0;
}

抱歉!评论已关闭.