总结一下我自己动手去写的题目;
1036选数 我自己尝试着不看题解去写,程序能编译成功可是答案不对,看来我的搜索写的,后来看了题解发现我的思路是对的,但是细节处理;
1331海战 这是联通块问题的升级版,我自己写的第一遍被判断块是否是矩形难住了,我的想法是:当一个#的一个直角方向有两个#时,则需要判断他的对角线方向是否是#,若不是,则直接输出Bad Placement;但我的水平没有实现,后来看了题解发现可以用这种方法判断是否合法:
在一个2*2方格中若有三个#则为不合法,每个块都和在它右下方向的三个块判断一下:
bool d(int i,int j){
int c=0;
if(map[i][j]=='#')c++;
if(map[i+1][j]=='#')c++;
if(map[i][j+1]=='#')c++;
if(map[i+1][j+1]=='#')c++;
if(c==3)return 0;
return 1;
}//判断是否合法
1596 这是经典的联通块的问题,用dfs最简单:
遇到#先ans++,把坐标输入搜索函数dfs(x,y)
在dfs函数中:先把(x,y)位置的#变成 . 再向其余八个方向遍历,遇到#继续把坐标放进dfs(x,y)
bfs也可以做:
void bfs(int x,int y){
s[x][y]='.';
int dx,dy;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
dx=x+i;
dy=y+j;
if(dx>=0&&dx<n&&dy>=0&&dy<m&&s[dx][dy]=='W'){
hori.push(dx);//把行放入队列
para.push(dy);//把列放入队列
}//需要注意的是其实可以用一个队列维护,但是用两个队列更好写,更直观
}
}
}
BFS就是维护一个队列,以一个点往四周搜索,如果符合条件的话就把它放进队列里
优点:同级优先搜索,在求最优解的时候可以避免许多无用的搜索,提高效率、可以避免递归
缺点:不好写,易出问题,用stl写队列很慢
7200 质数除了2以外都是奇数,而且奇数加奇数只能是偶数。所以当一个不为2的质数加减为质数,只能加减2。但如果这个质数为2的时候,只能加到质数(质数加二或质数减二 )。
3958奶酪 涉及到了并查集的内容。相连(相切或相交)的洞算作是一个集合,若一个集合中同时存在与底部,顶部相连的球,则输出yes。
1135 求最短路径的题最好用fbs:
广度优先搜索算法的基本思想:
1、对于初始状态入队,设置初始状态为已访问
2、如果队列不为空时,出队队头元素,否则跳到第5步
3、检查出队的元素是否为最终解,如果是则跳到第5步。
4、对于出队的元素,检查所有相邻状态,如果有效并且未访问,则将
所有有效的相邻状态进行入队,并且设置这些状态为已访问,然后
跳到第2步重复执行
5、检查最后出队的元素是否为最终解,如果是输出结果,否则说明无解
自己看题的效率还是太慢,也在有慢慢进步,加油