| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2827 人关注过本帖, 1 人收藏
标题:倒水问题求编程,你给力我给分!
只看楼主 加入收藏
取消关键字高亮
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:16 
本不打算参与,既然老杨也来了,那就凑个热闹。
这题就是个有限状态机而已。可以用有向图穷搜,也可以用树(展开的有向图)穷搜。
程序代码:
#include<stdio.h>
const int v[3] = {12, 8, 5};
const int work[6][2] = {{0, 1}, {0, 2}, {1, 0}, {1, 2}, {2, 0}, {2, 1}};
typedef union
{
    char cup[3];
    int value;
} ST;
ST path[367];
int path_count, path_index;
int min_count = 368, min_index;
int isInPath(ST st)
{
    int i;
    for(i = 0; i < path_count; i++)
        if(path[i].value == st.value) return 1;
    return 0;
}
void search(ST st)
{
    int i, a, b, c, t;
    ST tst;
    path[path_count++] = st;
    if(st.value == 0x606)
    {
        path_index++;
        if(min_count > path_count){ min_count = path_count; min_index = path_index;}
        printf("Method #%d: in step %d\n 12L  8L  5L\n------------\n", path_index, path_count - 1);
        for(i = 0; i < path_count; i++)
            printf(" %2d  %2d  %2d\n", path[i].cup[0], path[i].cup[1], path[i].cup[2]);
        putchar('\n');
        path_count--;
        return;
    }
    for(i = 0; i < 6; i++)
    {
        a = st.cup[work[i][0]];
        b = st.cup[work[i][1]];
        t = (a <= v[work[i][1]] - b) ? a : v[work[i][1]] - b;
        if(t == 0) continue;
        tst = st;
        tst.cup[work[i][0]] = a - t;
        tst.cup[work[i][1]] = b + t;
        if(isInPath(tst)) continue;
        search(tst);
    }
    path_count--;
}
int main()
{
    ST init = {.cup[0] = 12};
    search(init);
    printf("The best method is #%d in step %d\n", min_index, min_count - 1);
    return 0;
}

重剑无锋,大巧不工
2012-01-17 11:07
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 11楼 beyondyf
无法运行
2012-01-17 15:00
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:16 
110917 laoyang103 三个水杯 Accepted  8  1208 C/C++ 01-17 17:28:24
http://acm.nyist.
虽然写的不怎么样 照着杨大哥的也差早了  不过AC了  相信大家一定比我写的好
程序代码:
#include <stdio.h>
#include <queue>
using namespace std;

struct Node
{
    int sta[3];
    int step;
};

int work[6][2] = {{0,1},{0,2},{1,0},{1,2},{2,0},{2,1}};

int src[3];
int des[3];


bool bfs()
{
    bool foot[100][100][100] = {0};
    queue<Node> q;
    Node temp = {{src[0],0,0},0};
    foot[temp.sta[0]][temp.sta[1]][temp.sta[2]] = true;
    q.push(temp);

    while(!q.empty())
    {
        temp = q.front();
        q.pop();
        if(temp.sta[0] == des[0] &&
           temp.sta[1] == des[1] &&
           temp.sta[2] == des[2] )
        {
            printf("%d\n",temp.step);
            return true;
        }
        int i;
        for(i = 0;i<6;i++)
        {
            Node temp1 = temp;
            temp1.step++;
            int s = work[i][0],d = work[i][1];
            if(temp1.sta[s] <= src[d] - temp1.sta[d])
            {
                temp1.sta[d] += temp1.sta[s];
                temp1.sta[s] = 0;
            }
            else
            {
                temp1.sta[s] -= src[d] - temp1.sta[d];
                temp1.sta[d] = src[d];               
            }
            if(!foot[temp1.sta[0]][temp1.sta[1]][temp1.sta[2]])
            {
                q.push(temp1);
                foot[temp1.sta[0]][temp1.sta[1]][temp1.sta[2]] = true;
            }
        }
    }
    printf("-1\n");
    return false;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",src,src+1,src+2);
        scanf("%d%d%d",des,des+1,des+2);
        bfs();
    }
    return 0;
}
/*
2
6 3 1
4 1 1
9 3 2
7 1 1
*/


                                         
===========深入<----------------->浅出============
2012-01-17 17:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复12楼 share32

什么情况?我发代码都是实际调试过的。我用的编译器是MinGW的GCC
共121种方法,最优为第27种,需7步。
Method #27: in step 7
 12L  8L  5L
------------
 12   0   0
  4   8   0
  4   3   5
  9   3   0
  9   0   3
  1   8   3
  1   6   5
  6   6   0

回复13楼 laoyang103
中国的ACM OJ网站有几个你没去过的?
兄弟不必过谦,和你交流我也有很多收获。每个人的思路不同,相互学习借鉴才是提高之道。
呵呵,似乎这个论坛热衷算法的人越来越多,算法流正在壮大

重剑无锋,大巧不工
2012-01-17 19:35
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
呀,贴代码呀,贴代码呀,贴代码呀。

梅尚程荀
马谭杨奚







                                                       
2012-01-18 00:10
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
V版是省略版本,B版的无法运行,L版的运行后需要输入好多东西?

梅尚程荀
马谭杨奚







                                                       
2012-01-18 00:16
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 13楼 laoyang103
include <queue>

这个是什么?
2012-01-18 00:25
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 14楼 beyondyf
ST init = {.cup[0] = 12};

问题在这句上
2012-01-18 00:30
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
早安各位。
问题出在你们的编译器上。
兄弟们,你们要与时俱进了。这是C99标准下的指定初始化,这标准都出了十多年了,你们该熟悉一下了。
对于使用TC2.0和VC6.0的朋友,将那句初始化换成如下两句:
ST init;
init.value = 12;

另外,queue是对队列模板,封装了队列的各项属性和操作,老杨用它取代了我代码中path的功能。

重剑无锋,大巧不工
2012-01-18 08:32
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 19楼 beyondyf
可以运行了.
但是我得承认,看你的代码看得我万念俱灰,不是说你的写的不好,是我没看明白.
能麻烦你注释一下吗? 我想认真学习一下.谢谢!
2012-01-18 14:03
快速回复:倒水问题求编程,你给力我给分!
数据加载中...
 
   



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

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