目前共有5篇帖子。 內容轉換:不轉換▼
 
點擊 回復
246 4
我的《蚂蚁感冒》的代码
一派護法 十九級
1樓 發表于:2016-3-13 14:50
#include <stdio.h>
#include <stdlib.h>

typedef struct _ANT
{
    int pos;
    int flags;
} ANT;

#define AF_ILL 1
#define AF_OUT 2

// 判断蚂蚁i是否与另一只蚂蚁相遇
// n为蚂蚁总数
// 返回值: 相遇的另一只蚂蚁的序号
// 如果没有相遇的蚂蚁, 返回-1
int meet(ANT *ants, int n, int i)
{
    int j;
    for (j = 0; j < n; j++)
    {
        if (j == i || (ants[j].flags & AF_OUT))
            continue;
        if (abs(ants[j].pos) == abs(ants[i].pos))
            return j;
    }
    return -1;
}

void meetcheck(ANT *ants, int n, int i, int *pIll)
{
    int a = meet(ants, n, i);
    if (a == -1)
        return;

    ants[i].pos--;
    ants[a].pos--;
    ants[i].pos = -ants[i].pos;
    ants[a].pos = -ants[a].pos;

    // 感冒判定
    if ((ants[i].flags & AF_ILL) && !(ants[a].flags & AF_ILL))
    {
        ants[a].flags |= AF_ILL;
        (*pIll)++;
    }
    if ((ants[a].flags & AF_ILL) && !(ants[i].flags & AF_ILL))
    {
        ants[i].flags |= AF_ILL;
        (*pIll)++;
    }
}

// 返回值: out的增加值
int walk(ANT *ants, int n, int i, int *pIll)
{
    if (ants[i].flags & AF_OUT)
        return 0;

    ants[i].pos++;
    meetcheck(ants, n, i, pIll);
    if (ants[i].pos == 0 || abs(ants[i].pos) >= 100)
    {
        ants[i].flags |= AF_OUT;
        return 1;
    }
    return 0;
}

int main()
{
    int n, i;
    int ill = 1;
    int out = 0;
    ANT *ants;
    scanf_s("%d", &n);
    ants = (ANT *)malloc(n * sizeof(ANT));
    for (i = 0; i < n; i++)
    {
        scanf_s("%d", &ants[i].pos);
        if (i == 0)
            ants[i].flags = AF_ILL;
        else
            ants[i].flags = 0;
    }

    while (out < n)
    {
        for (i = 0; i < n; i++)
            out += walk(ants, n, i, &ill);
    }

    printf("%d\n", ill);

    free(ants);
    return 0;
}
一派護法 十九級
2樓 發表于:2016-3-13 14:50
部分数据会导致程序死循环无法得出结果。
一派護法 十九級
3樓 發表于:2016-3-13 14:59
蚂蚁感冒  03-13 14:59  1.336KB  C  运行超时  50  运行超时  1.601MB  评测详情 


还好得了50分
看来就是部分数据死循环的问题
一派護法 十九級
4樓 發表于:2016-3-13 15:08
#include <stdio.h>
#include <stdlib.h>

typedef struct _ANT
{
    int pos;
    int flags;
    int refcnt;
} ANT;

#define AF_ILL 1
#define AF_OUT 2

int meet(ANT *ants, int n, int i)
{
    int j;
    if (ants[i].refcnt > 100)
        return -1;
    for (j = 0; j < n; j++)
    {
        if (j == i || (ants[j].flags & AF_OUT) || ants[j].refcnt > 100)
            continue;
        if (abs(ants[j].pos) == abs(ants[i].pos))
            return j;
    }
    return -1;
}

void meetcheck(ANT *ants, int n, int i, int *pIll)
{
    int a = meet(ants, n, i);
    if (a == -1)
        return;

    ants[i].refcnt++;
    ants[a].refcnt++;
    ants[i].pos--;
    ants[a].pos--;
    ants[i].pos = -ants[i].pos;
    ants[a].pos = -ants[a].pos;

    if ((ants[i].flags & AF_ILL) && !(ants[a].flags & AF_ILL))
    {
        ants[a].flags |= AF_ILL;
        (*pIll)++;
    }
    if ((ants[a].flags & AF_ILL) && !(ants[i].flags & AF_ILL))
    {
        ants[i].flags |= AF_ILL;
        (*pIll)++;
    }
}

int walk(ANT *ants, int n, int i, int *pIll)
{
    if (ants[i].flags & AF_OUT)
        return 0;

    ants[i].pos++;
    meetcheck(ants, n, i, pIll);
    if (ants[i].pos == 0 || abs(ants[i].pos) >= 100)
    {
        ants[i].flags |= AF_OUT;
        return 1;
    }
    return 0;
}

int main()
{
    int n, i;
    int ill = 1;
    int out = 0;
    ANT *ants;
    scanf("%d", &n);
    ants = (ANT *)malloc(n * sizeof(ANT));
    for (i = 0; i < n; i++)
    {
        scanf("%d", &ants[i].pos);
        ants[i].refcnt = 0;
        if (i == 0)
            ants[i].flags = AF_ILL;
        else
            ants[i].flags = 0;
    }

    while (out < n)
    {
        for (i = 0; i < n; i++)
            out += walk(ants, n, i, &ill);
    }

    printf("%d\n", ill);

    free(ants);
    return 0;
}

评测结果:错误
得分:50
一派護法 十九級
5樓 發表于:2016-3-13 22:20
得了一半的分还是不错了

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:246 回複數:4
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-3-13 22:20
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。