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