A - 棋盘问题
我的做法是从上到下,从左到右扫描,每次扫描到一个可用的棋盘(‘#’),当前行和当前列都不能再有可用的棋盘(‘#’),然后进入下一层并往后继续扫描,一旦扫描到k个可用的棋盘(‘#’),就得到一种方案,递归得到所有的方案数即得到本题的解。
/***********************************************
* Author: fisty
* Created Time: 2015/1/27 21:45:57
* File Name : 1_A.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
B - Dungeon Master
本题从‘S’出发,每次可以选择东南西北上下6个方向中可走的位置走一步(用dx,dy,dz数组控制),BFS可以确保第一个搜到‘E'的解为最少步数解。代码如下:
/***********************************************
* Author: fisty
* Created Time: 2015/1/28 9:14:26
* File Name : 1_B.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
C - Catch That Cow
只不过是改成了一维的BFS,应该是更简单了。只不过只有往前一步,往后一步,和跳跃(2*X)。具体见代码~~
/***********************************************
* Author: fisty
* Created Time: 2015/1/28 11:19:54
* File Name : 1_C.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
D -
Fliptile
给定一个N*M的网格,每个网格里有一个数字,0或者1,要求你翻转尽量少的网格,使得所有网格的数字都变为0,对于某一个网格进行翻转操作时,与它有公共边的网格全部会被翻转。
枚举第一行的状态,只要第一行的状态确定了,可以往下推出其余状态。
/***********************************************
* Author: fisty
* Created Time: 2015/1/28 15:43:04
* File Name : 1_D.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
E - Find The Multiple
在1~200的数据里,结果不会有100位的。。所以用unsigned long long就可以存下
直接搜第k*10和k*10+1就可以
/***********************************************
* Author: fisty
* Created Time: 2015/1/28 16:55:14
* File Name : 1_E.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
F - Prime Path
1.先将两个数每一位进行分离,保存起来
2.用bfs来解,把4位数字看成一个状态,每一位数可以变换9次,而且有4位数,每变换一个位,检查是否是素数并且没有被访问过,如果是,放入队列。如果可以达到目标状态,那么输出最少的步数,直到队列为空也没有找到,返回无解
题解链接
J - Fire!
需要两个BFS,第一个寻找每块空地被蔓延到的时间,第二个寻找人离开这里的最短路径,如果必须被烧到则输出IMPOSSIBLE
需要注意的就是人只有一个出发点,但是可以有N个着火点,N也可以为0,WA了无数次总结出来的。。
我这里直接用的G[MAX_N][MAX_N]来保存的地图。如果是墙,则为-1,是空地设置为INF,第一次bfs之后,G里面保存的是火到达每一个空地的时间(墙还是-1)
所以在第二次bfs人逃跑的时候,只要这个人可以赶在这个点着火之前通过就可以
题解链接
K - 迷宫问题
设置一个数组pre[i] 表示i的路径前驱是pre[i],只不过类型是坐标形式。pre得到的是从终点到起点的路径,输出需要借助栈反序
/***********************************************
* Author: fisty
* Created Time: 2015/1/29 12:53:29
* File Name : 1_K.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include
M-非常可乐
就是用队列模拟倒水的情况。。
若s中有水,那么有两种情况,可以给n倒,也可以给m倒
1.给n倒 有两种情况
A.可以倒满
B.倒不满
2.给m倒 有两种情况
A.可以倒满
B.倒不满
若n中有水。。m中有水,还是上面相同的倒法,输出最少步数
题解链接
N - Find a way
1.用BFS分别找出‘Y’和‘M’到每个‘@’点的最小时间。
2.枚举每个‘@’的位置,并找出到‘Y’点、‘M’点之和的最短距离。
3.输出第2步求的的最短距离乘以11.
/***********************************************
* Author: fisty
* Created Time: 2015/1/29 16:29:39
* File Name : 1_N.cpp
*********************************************** */
#include
#include
#include
#include
#include
#include
#include
#include