| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:强,赞一个,同时bs楼上In Reply To:用一点数学方法加速 1915 Posted by:gemenhao at 2006-05-31 10:47:20 > step1:
> 一些特殊情况先处理
> 作对称和交换满足 endy >= endx,staty >= statx
> if (startx > endx)
> {
> swap(startx, endx);
> swap(starty, endy);
> }
> if (starty > endy)
> {
> starty = n - 1 - starty;
> endy = n - 1 - endy;
> }
> int linecheck(int n) //在某些些直线上预先排除
> {
> minsteps = -1;
> int disy = endy - starty;
> int disx = endx - startx;
> if (disx == 0 && disy == 0)
> minsteps = 0;
> else if ( disy == 2 * disx || disx == 2 * disy)
> minsteps = disx < disy ? disx : disy;
> else if ( disx + disy == 1 )
> minsteps = 3;
> else if ( disx == 1 && disy == 1 && ( startx + starty == 0 || endx + endy == 2*(n -1) ) )
> minsteps = 4;
> else if (disx == 2 && disy == 2)
> minsteps = 4;
> return minsteps;
> }
>
> step2:
>
> 对于 n > 6
> 考虑奇偶性以及马每步跳的步长为3(2+1,1+2)
> 可以得到最小步 step3 >= { (disx + disx) / 3 }
>
> int Search(int n)
> {
> int step2, step3;
> int disx = endx - startx;
> int disy = endy - starty;
>
> step2 = disy > disx ? disy : disx ;
> if (step2 % 2 == 0)
> step2 /= 2;
> else
> step2 = step2 / 2 + 1;
>
> if ( (disx + disy) % 3 == 0 )
> step3 = (disx + disy) / 3;
> else
> step3 = (disx + disy) / 3 + 1;
>
> if (step3 < step2)
> step3 = step2;
> if ( step3 % 2 != (disx + disy) % 2 )
> step3 += 1;
> minsteps = step3;
> return step3;
> }
> step3
> 对于n < 6 直接用BFS搜索
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator