【UVA11205】The broken pedometer,思路+代码,可能是最不装逼最朴素最易懂效率也最差的代码。

原创 2012年03月29日 02:17:52
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
/**
    Problem : UVA11205 - The broken pedometer
    Begin Time: 28th/Mar/2012 11:30 a.m.
    Finish Time: 29th/Mar/2012 2:14 a.m.
    Last Time : About 6 hours.
    State:9924407	11205	The broken pedometer	Accepted	C++	2.684	2012-03-28 18:11:32
    Knowledge : BFS,剪枝都没有,还有子集生成,也算有个小小的状态压缩?
    Exp.: WA * 4 :这四个Wrong Answer奉献给了误把BFS写成DFS,不应该
          WA * 4 :我他妈对于后四个WA无力吐槽了啊我操。边界,边界!
                    tmp.depth + 1 <= col写成了 tmp.depth + 1 < col结果就少了一组组合啊!过脑子啊白痴!写程序时。
                    操操操操操。
    Thought:
            每行换成10110101这样的整数(因为最多才2^15,不用位运算了,否则怪麻烦的)
            开一个数组isSel[],如果ith列被选了那么isSel[i] = true;
            然后根据isSel判断目前选的列数,以及应该从那几列中抽取子集。
            其实位运算能快一些。
    Summerize:
            发现搜索出错的时候
            1.仔细想一下搜索的过程,状态转移的方式,是否有状态结点未展开
            2.想一下边界,是否有问题
            最重要的,写之前看清楚了,一般有最短,最少,最小字样的统统为BFS.
            搜索的如果是个树,则不需要回溯,如果是个图,则需要回溯。
*/
const int MAXN = 200;
const int MAXP = 50;
int puzzle[MAXN][MAXP];
int subset[MAXN];
bool isSel[MAXN];
int minN;
bool isFound;
struct node
{
    int depth;
    bool isSel[MAXN];
};
node tmp;
queue<node> que;
int comp(const void *a, const void *b)
{
    return (*(int*)a - *(int*)b);
}
bool check(int row,int col)
{
    int cnt = 0;

    memset(subset,0,sizeof(subset));
    for(int i = 0 ; i < col ; i++)
    {
        if(isSel[i] == true)
            cnt++;
    }

    for(int j = 0 ; j < row ; j++)
    {
        for(int i = 0 ; i < col ; i++)
        {
            if(isSel[i] == true )
            {
                subset[j] = subset[j] * 10 + puzzle[j][i];
            }
        }
    }

    qsort(subset,row,sizeof(int),comp);

    int i = 0;
    int j = i+1;
    while( j < row )
    {
        if(subset[i] == subset[j])
        {
            return false;
        }
        i++,j++;
    }
    if( minN > cnt)
    {
        minN = cnt;
    }
    return true;
}
int Solve(int row,int col,int now)
{
    node tmp,tmp1,k;
    while(!que.empty())
    {
        tmp=que.front();
        que.pop();
        memcpy(isSel,tmp.isSel,sizeof(isSel));
        tmp1 = tmp;
        check(row,col);
        if(tmp.depth + 1  <= col)
        {
            tmp1.depth = tmp.depth + 1;
            tmp1.isSel[tmp1.depth - 1] = false;
            que.push(tmp1);
            tmp1.isSel[tmp1.depth - 1] = true;
            que.push(tmp1);
        }
    }
    return minN;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("b:\\acm\\UVA\\UVA11205\\input.txt","r",stdin);
    freopen("b:\\acm\\uva\\uva11205\\output.txt","w",stdout);
#endif
    int T,P,N,k;
    //  while( scanf("%d",&T) != EOF )
    scanf("%d",&T);
    {
        for(int t = 1 ; t <= T ; t++)
        {
            scanf("%d%d",&P,&N);
            memset(puzzle,0,sizeof(puzzle));
            memset(subset,0,sizeof(subset));
            memset(isSel,0,sizeof(isSel));
            for(int i = 0 ; i < N ; i++)
            {
                for(int j = 0 ; j < P ; j++)
                {
                    scanf("%d",&puzzle[i][j]);
                }
            }
            minN = 200;

            tmp.depth = 1;
            tmp.isSel[0] = true;
            que.push(tmp);

            tmp.depth = 1;
            tmp.isSel[0] = false;
            que.push(tmp);

            k = Solve(N,P,0);
            printf("%d\n",k);
            while(!que.empty())
            {
                que.pop();
            }
        }

    }
    return 0;
}

分享史上java最牛逼,最简短的代码

确实是12306的最核心代码呀 alert("当前访问用户过多,请稍后重试!"); 确实牛 public class Test{ static{ System.ou...
  • fk5431
  • fk5431
  • 2015年11月25日 13:27
  • 1400

简单的第三方登录之QQ

1.jar包导入 2.权限    
  • xiaoxiaoluc
  • xiaoxiaoluc
  • 2017年06月22日 19:26
  • 506

最牛X的编程语言

最牛X的编程语言——老板语看过诸多精彩的语言帖之后,突然觉得什么JAVA啦,C/C++啦,LISP啦, C#啦,统统是小意思。下面我来介绍一种全新的语言——老板语。同志们,有个事儿我跟大伙儿说说。我是...
  • isaaq
  • isaaq
  • 2007年03月06日 09:46
  • 2120

六个变态的hello word&&怎么写混乱代码&&在线编译器

下面的六个程序片段主要完成这些事情:输出Hello, World混乱C语言的源代码下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。hello1.c  ...
  • wesweeky
  • wesweeky
  • 2011年06月09日 16:23
  • 4481

“最牛B”的一则招聘启事

原贴:http://blog.csdn.net/ecitnet/archive/2008/01/24/2062593.aspx最近CSDN上看到了一则被网友称为“最牛B”的一则招聘启事    最近CS...
  • chinalinuxzend
  • chinalinuxzend
  • 2008年01月25日 19:38
  • 2293

最牛B的编码套路

当你能编写精彩的代码、并且能用精彩的言辞向世人解释那些代码时,到那时候,我会觉得你已经掌握了最牛的编码套路!...
  • happydeer
  • happydeer
  • 2013年12月02日 08:38
  • 51235

史上最牛逼的程序-短小精悍

下面分享一个世界上最牛逼的程序,这个程序十分短小精悍,以至于它只由171行十六进制的机器码构成。虽然非常短小,但是实现的效果令人惊叹,下面是全部代码。 下载链接:http://download.cs...
  • u013752202
  • u013752202
  • 2015年11月16日 23:35
  • 1110

10个最“牛叉”的代码注释

你看到过的最好的代码注释是什么样的?看看这些够不够牛!
  • wdcxylg
  • wdcxylg
  • 2016年03月16日 23:31
  • 341

Python--如此高效的代码片段

出自: http://www.maxburstein.com/blog/python-shortcuts-for-the-python-beginner/我是一个C++程序员,所以把拿C++与Pyt...
  • wangshubo1989
  • wangshubo1989
  • 2016年10月26日 23:46
  • 12695

我们要有最朴素的生活,与最遥远的梦想 ,即使明日天寒地冻,路遥马亡。

无法知道余生还要渡过多少不能被分担的漫漫长夜,无法知道我在那些漫漫长夜之后的黎明醒来想起这一段往事来,会是怎样的落寞不堪。我常梦见重逢时刻:在嘈杂的街头,偶遇你与你的爱人孩子,点头微笑的瞬间背后是梦断...
  • qq_33854260
  • qq_33854260
  • 2017年11月08日 19:35
  • 301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【UVA11205】The broken pedometer,思路+代码,可能是最不装逼最朴素最易懂效率也最差的代码。
举报原因:
原因补充:

(最多只允许输入30个字)