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次就可以实现平分可乐,但这种平分的方式也不被本题所允许。