kuangbin带你飞 专题一 简单搜索 (题解)

POJ 3279 

题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略。

题解:枚举第一行翻转情况(二进制),2^c,然后验证,由于第一行确定了,后面就可以跟着确定了。

尽量不要直接翻转初始状态,不然会影响后续的情况(我被坑了好几个小时)。如下判断:

int get(int x,int y)//(x,y)的颜色  
{  
    int res=map[x][y];  
    for(int i=0;i<5;i++)  
    {  
        int a=x+dx[i],b=y+dy[i];  
        if(a>=0&&a<m&&b>=0&&b<n)  
        {  
            res+=flip[a][b];  
        }  
    }  
    return res&1;  
}  

POJ 1426

题意:找n的倍数,这个倍数的数字只有0或1;

题解:这个倍数有100位,每次余数乘10之后+0或者+1,有两种情况,可以用BFS做。

用三维数组pre[][][]存状态,第一维是余数,第二维是此时的位数,第三维是当前位是0还是1,pre的值为前一个状态

void dabiao(){
    for(int n=1;n<=200;n++){
        memset(pre,-1,sizeof(pre));
        queue<int> q;
        int m=1%n;
        pre[m][1][1]=-1;
        q.push(m*10000+10+1);
        while(!q.empty()){
            int t=q.front();
            int x=t/10000;
            int y=(t-10000*x)/10;
            int z=t-10000*x-10*y;
            q.pop();
            if(x==0){
                cun(t,n);
                break;
            }
            for(int i=0;i<2;i++){
                m=(x*10+i)%n;
                pre[m][y+1][i]=t;
                q.push(m*10000+(y+1)*10+i);
            }
        }
    }
}

POJ  3414 pots

这个题应该比较明显是BFS,不过状态记录有点烦, 我开了int pre[105][105][5][30] 这样的四位数组记录状态。。。


FZU 2150

比较繁琐的BFS,wa了好多次没有发现错误。

题意 :就是有两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的。问你最少花多少时间可以烧掉,如果烧不掉就输出-1

思路 :先BFS判断有几个连通块,大于2输出-1,等于2时,就分别求出两个连通块里的最短时间然后取最大,等于1时,就遍历在一个连通块里任意两个点(可以相同)都放进队列里BFS(写的时候失误太多)

UVa 11642

真是题题trick,此题不造我哪里错了,无法理解,题解是火和人一起放进queue里,然后火先走,人走出去的时候就是可以



HDU  1495

这题的题意就是个大坑。题目是非常的简单

trick:   题目中只说要平分可乐,但实际上本题对于最终实现平分的方式也是有要求的,那就是最终在S中必须有S/2单位的可乐,且过程中不能提前喝可乐。

例如 4 1 3 这组数据,只要从4倒到3,再从3倒到1,一共倒2次就能够得到2单位的可乐了(存放在M中),但样例中给的答案是倒3次,也就是要把N中那1单位的可乐倒回S中才行。

再比如 6 1 1 这组数据,其实我可以每次从S(S=6)中倒出1单位的可乐到N或M中,再把它喝掉,如此循环3次就可以实现平分可乐,但这种平分的方式也不被本题所允许。


你可能感兴趣的:(ACM)