| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5840 人关注过本帖, 1 人收藏
标题:沙漠和绿洲
只看楼主 加入收藏
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
擦 犯了个很愚蠢的错误
2012-08-19 21:31
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
错了4组数据。问题发生在哪里?看来我的想法还不完备。有意思。先把代码发上来。

程序代码:
#include<stdio.h>

#define LEN        600

int map[LEN][LEN], n, m;
int lr[LEN * LEN], lc[LEN * LEN];
int tcount, bcount, vlen;
char top[LEN], bottom[LEN], v[LEN][LEN];

int flood(int col, char * mk)
{
    int len, br, r, c, h, t, i, count = 0;
    char f[LEN][LEN] = {0};

    br = n - 1;
    f[lr[0] = 0][lc[0] = col] = 1;
    if(lr[0] == br) count++;
    for(len = 1, i = 0; count < m && i < len; i++)
    {
        r = lr[i];
        c = lc[i];
        h = map[r][c];
        if((t = r - 1) >= 0 && map[t][c] < h && f[t][c] == 0)
        {
            f[t][c] = 1;
            lr[len] = t;
            lc[len++] = c;
        }
        if((t = c + 1) < m && map[r][t] < h && f[r][t] == 0)
        {
            f[r][t] = 1;
            lr[len] = r;
            lc[len++] = t;
            if(r == br) count++;
        }
        if((t = r + 1) < n && map[t][c] < h && f[t][c] == 0)
        {
            f[t][c] = 1;
            lr[len] = t;
            lc[len++] = c;
            if(t == br) count++;
        }
        if((t = c - 1) >= 0 && map[r][t] < h && f[r][t] == 0)
        {
            f[r][t] = 1;
            lr[len] = r;
            lc[len++] = t;
            if(r == br) count++;
        }
    }
    for(i = 0; i < m; i++)
    {
        if(f[0][i] && !top[i])
        {
            top[i] = 1;
            tcount++;
        }
        mk[i] = f[br][i];
        if(mk[i] && !bottom[i])
        {
            bottom[i] = 1;
            bcount++;
        }
    }
    return count;
}

void analyze(int * out1, int * out2)
{
    int count, i, j, k;
    int b[LEN] = {0}, bv[LEN] = {0};
   
    for(i = 0; i < m; i++) top[i] = bottom[i] = 0;
    for(tcount = bcount = vlen = i = 0; tcount < m;)
    {
        while(top[i]) i++;
        while(i < m - 1 && map[0][i] < map[0][i + 1]) i++;
        count = flood(i, v[vlen]);
        if(count) vlen++;
        if(count == m)
        {
            *out1 = 1;
            *out2 = 1;
            return;
        }
    }
    if(bcount < m)
    {
        *out1 = 0;
        *out2 = m - bcount;
        return;
    }
    for(i = 0; i < vlen; i++)
    {
        for(bv[i] = 1, j = 0; j < m; j++) b[j] += v[i][j];
        for(k = 0; k <= i; k++)
        {
            if(!bv[k]) continue;
            for(j = 0; j < m && (!v[k][j] || b[j] > 1); j++);
            if(j < m) continue;
            for(j = 0; j < m; j++) b[j] -= v[i][j];
            bv[k] = 0;
        }
    }
    for(*out1 = 1, *out2 = 0, i = 0; i < vlen; i++) *out2 += bv[i];
}

int main()
{
    int i, j;
    scanf("%d%d", &n, &m);
    for(i = 0; i < n; i++)
    for(j = 0; j < m; scanf("%d", &map[i][j++]));
    analyze(&i, &j);
    printf("%d\n%d\n", i, j);
    return 0;
}

重剑无锋,大巧不工
2012-08-19 22:02
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
晕死,AC了,原来是一处笔误导致的问题。看看大家的眼力如何能不能找得到。大家先看看代码,如果哪位看懂了欢迎替我解释。
程序代码:
#include<stdio.h>

#define LEN        600

int map[LEN][LEN], n, m;
int lr[LEN * LEN], lc[LEN * LEN];
int tcount, bcount, vlen;
char top[LEN], bottom[LEN], v[LEN][LEN];

int flood(int col, char * mk)
{
    int len, br, r, c, h, t, i, count = 0;
    char f[LEN][LEN] = {0};

    br = n - 1;
    f[lr[0] = 0][lc[0] = col] = 1;
    if(lr[0] == br) count++;
    for(len = 1, i = 0; count < m && i < len; i++)
    {
        r = lr[i];
        c = lc[i];
        h = map[r][c];
        if((t = r - 1) >= 0 && map[t][c] < h && f[t][c] == 0)
        {
            f[t][c] = 1;
            lr[len] = t;
            lc[len++] = c;
        }
        if((t = c + 1) < m && map[r][t] < h && f[r][t] == 0)
        {
            f[r][t] = 1;
            lr[len] = r;
            lc[len++] = t;
            if(r == br) count++;
        }
        if((t = r + 1) < n && map[t][c] < h && f[t][c] == 0)
        {
            f[t][c] = 1;
            lr[len] = t;
            lc[len++] = c;
            if(t == br) count++;
        }
        if((t = c - 1) >= 0 && map[r][t] < h && f[r][t] == 0)
        {
            f[r][t] = 1;
            lr[len] = r;
            lc[len++] = t;
            if(r == br) count++;
        }
    }
    for(i = 0; i < m; i++)
    {
        if(f[0][i] && !top[i])
        {
            top[i] = 1;
            tcount++;
        }
        mk[i] = f[br][i];
        if(mk[i] && !bottom[i])
        {
            bottom[i] = 1;
            bcount++;
        }
    }
    return count;
}

void analyze(int * out1, int * out2)
{
    int count, i, j, k;
    int b[LEN] = {0}, bv[LEN] = {0};
   
    for(i = 0; i < m; i++) top[i] = bottom[i] = 0;
    for(tcount = bcount = vlen = i = 0; tcount < m;)
    {
        while(top[i]) i++;
        while(i < m - 1 && map[0][i] < map[0][i + 1]) i++;
        count = flood(i, v[vlen]);
        if(count) vlen++;
        if(count == m)
        {
            *out1 = 1;
            *out2 = 1;
            return;
        }
    }
    if(bcount < m)
    {
        *out1 = 0;
        *out2 = m - bcount;
        return;
    }
    for(i = 0; i < vlen; i++)
    {
        for(bv[i] = 1, j = 0; j < m; j++) b[j] += v[i][j];
        for(k = 0; k <= i; k++)
        {
            if(!bv[k]) continue;
            for(j = 0; j < m && (!v[k][j] || b[j] > 1); j++);
            if(j < m) continue;
            for(j = 0; j < m; j++) b[j] -= v[k][j];
            bv[k] = 0;
        }
    }
    for(*out1 = 1, *out2 = 0, i = 0; i < vlen; i++) *out2 += bv[i];
}

int main()
{
    int i, j;
    scanf("%d%d", &n, &m);
    for(i = 0; i < n; i++)
    for(j = 0; j < m; scanf("%d", &map[i][j++]));
    analyze(&i, &j);
    printf("%d\n%d\n", i, j);
    return 0;
}
收到的鲜花
  • 有容就大2012-08-19 23:20 送鲜花  10朵   附言:牛 就一个字啊 哈哈

重剑无锋,大巧不工
2012-08-19 22:23
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
杨大哥 我这个是错在哪? 你怎么知道错了四组数据的?

我的代码已经AC,在55楼。

[ 本帖最后由 demonleer 于 2012-8-20 10:46 编辑 ]
2012-08-19 22:24
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 44楼 demonleer
它的结果中有提示啊。你最后一次提交的结果7组正确,3组错误。再前一次提交是超时了,应该发生在第9组数据,之前有5组正确,3组错误。

我去洗个澡,回来看你代码。

重剑无锋,大巧不工
2012-08-19 22:28
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用beyondyf在2012-8-19 22:28:49的发言:

它的结果中有提示啊。你最后一次提交的结果7组正确,3组错误。再前一次提交是超时了,应该发生在第9组数据,之前有5组正确,3组错误。

我去洗个澡,回来看你代码。


原来那几个数字是这个意思, 7AC,3WA,我擦 错哪儿了 NND
2012-08-19 22:32
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 43楼 beyondyf
呵呵 我找到了。
 for(j = 0; j < m; j++) b[j] -= v[i][j];这个要换成
 for(j = 0; j < m; j++) b[j] -= v[k][j];

梅尚程荀
马谭杨奚







                                                       
2012-08-19 23:00
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 48楼 有容就大
正确。大家由此也可以看出编程是多么需要细心严谨的活了吧。仅仅敲错一个字符,编译过程无法发现,还能成功地解决部分问题。一度让你怀疑是理论出了问题。

重剑无锋,大巧不工
2012-08-19 23:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 47楼 demonleer
有点晚了,我明天再看吧。大家也该休息了,睡前不宜做使大脑兴奋的事。

重剑无锋,大巧不工
2012-08-19 23:12
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 48楼 beyondyf
呵呵 光顾看了 都忘了评分啦  


梅尚程荀
马谭杨奚







                                                       
2012-08-19 23:19
快速回复:沙漠和绿洲
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021730 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved