2011年8月22日
摘要: POJ_2488又是一个骑士问题,果然在广搜中骑士问题是很经典的哈。这个题目比之间做过的骑士的问题实质上就是多了路径的打印,并且最后如果存在路径的话,路径要求是字典序最小的方案。做到字典序最小还是比较容易的,只要在dfs的时候按照从左到右,从上到下的顺序去dfs就可以了。我又一次把棋盘上的运算搞错了,以后一定要引起注意!上下移动对应x的减少与增加,左右移动对应着y的减少与增加!#include<stdio.h>#include<string.h>int vis[30][30],fax[30][30],fay[30][30],p,q,count,n;int ansx[30 阅读全文
posted @ 2011-08-22 23:09 Staginner 阅读(349) 评论(0) 推荐(0) 编辑
摘要: POJ_1915 这个题目跟POJ_2243是非常相似的,只不过棋盘的大小是变化的而已。在读起点与终点之后,只需要从起点开始,对周围8个可达的位置进行广搜并依次记录到达该位置时的步数,当搜到终点的时候退出循环即可。#include<stdio.h>#include<string.h>int vis[310][310],dis[310][310],qx[90010],qy[90010];int dx[]={1,2,2,1,-1,-2,-2,-1},dy[]={2,1,-1,-2,-2,-1,1,2};int main(){ int i,j,k,L,n,front,rear 阅读全文
posted @ 2011-08-22 20:53 Staginner 阅读(281) 评论(0) 推荐(0) 编辑
  2011年8月20日
摘要: POJ_2243 在读入并转化起点与终点之后,只需要从起点开始,对周围8个可达的位置进行广搜并依次记录到达该位置时的步数,当搜到终点的时候退出循环即可。#include<stdio.h>#include<string.h>char s[5],t[5],sx,sy,tx,ty;int a[10][10],dis[10][10],qx[100],qy[100];int dx[]={-1,-2,-2,-1,1,2,2,1},dy[]={-2,-1,1,2,2,1,-1,-2};int main(){ int i,x,y,newx,newy,front,rear,min; wh 阅读全文
posted @ 2011-08-20 01:44 Staginner 阅读(217) 评论(0) 推荐(0) 编辑
摘要: POJ_3620 只要顺序遍历每个格子,找到一个有水的格子后就以这个格子为起点进行深搜或者广搜即可,直到把连成片的有水的格子搜完即可,然后将搜到的有水的格子数与max进行比较,如果比max大则更新max的值。#include<stdio.h>#include<string.h>int a[110][110],sx[1010],sy[1010];int dx[]={-1,1,0,0},dy[]={0,0,-1,1};int main(){ int i,j,k,N,M,K,top,x,y,newx,newy,max,count; while(scanf("%d%d 阅读全文
posted @ 2011-08-20 00:53 Staginner 阅读(206) 评论(0) 推荐(0) 编辑
  2011年8月19日
摘要: POJ_1088一开始没有什么思路,看了别人的代码后才发现原来这个题目就是一个动态规划的题目,主要的过程用记忆化递归来实现。在记录好各点的高度后,只需要依次枚举每个点,如果该点的dis[][]已被赋值,那么就直接将其与maxdis进行比较,之后maxdis更新为较大值,如果该点的dis[][]没有被赋值,那么就以该点为基础,向周围四个方向中可达的方向进行深搜,之后将dis[][]记录为这几个方向中的最大值+1,再将dis[][]的值与maxdis进行比较。#include<stdio.h>#include<string.h>int height[110][110],di 阅读全文
posted @ 2011-08-19 23:57 Staginner 阅读(248) 评论(0) 推荐(0) 编辑
  2011年8月17日
摘要: POJ_2362 在有了POJ_1011的基础之后,这个题目还是能够比较轻松地独立完成的。#include<stdio.h>#include<string.h>#include<stdlib.h>int state[10010],st[10010],d,n,sum;int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q=(int *)_q; return *q-*p; }int dfs(int rest,int complete,int start){ int i; if(rest== 阅读全文
posted @ 2011-08-17 22:23 Staginner 阅读(251) 评论(0) 推荐(0) 编辑
摘要: POJ_1011做完这个题目,让我不仅学到了一些别人剪枝的策略,更重要的是让我意识到了在搜索中剪枝的重要性。所谓剪枝,其实就是对程序的优化,尽可能地避免程序执行无用的操作。就这个题目而言,程序的优化主要有以下几个方面:①我们在拼木棒之前应该对木棒最长到短进行排序,这样方便我们后面挑选木棒的操作,因为如果前面先拼短木棒的话,很有可能后面任何一根木棒都不能填补剩余的长度,而先拼长木棒就可以在本来有解的情况下避免出现这种问题。②枚举拼好的木棒的长度时,枚举区间应在max(len)与sum/2之间,如果在这个区间内还没有找到解,那么最后的解只能是sum。③枚举的拼好的木棒的长度必须能够整除所有木棒长度 阅读全文
posted @ 2011-08-17 21:33 Staginner 阅读(544) 评论(3) 推荐(0) 编辑
摘要: POJ_1753这个题目第一次看也确实没有什么思想,后来到网上看了一下“点灯游戏”的简介,也获得了不少的启发。这个题目关键的算法思想在于,对最少操作次数而言,由于每个棋子点击偶数次相当于没点,同时点击的顺序并不影响最终结果,所以每个棋子要么点击一次,要么干脆不点,理解了这一点之后思路便是大体形成了。于是把黑、白棋布局用1、0存储,再用一个4*4的数组和16层for循环来枚举操作的所有情况,之后一一计算每种操作是否能达到预期效果以及其所需的操作次数即可,所有的情况是2^16种,计算量还是可以接受的。(中间过了很多天……)时隔一个月之后,已经做完了八数码,便迫不及待的想找个题来巩固一下做八数码学到 阅读全文
posted @ 2011-08-17 02:04 Staginner 阅读(382) 评论(0) 推荐(0) 编辑
摘要: POJ_1077经典的八数码问题,做完之后突然想到一句台词:“我的人生又趋于完整了一点……”。一开始接触这个确实觉得比较难,后来突然在刘汝佳书上发现原来是有讲这个问题的,于是我如获至宝,赶紧研究起刘汝佳的代码来,边学边写,总算是把代码写完了,同时又在他的代码和提示的基础上自己写了打印路径的方式。研究这个题的代码时,第一次比较认真地看了Hash的有关内容,掌握了一些基础的Hash判重的方法,同时对状态的表示也有了更深一步的理解,总之收获不菲呀。#include<stdio.h>#include<string.h>#define MAX 1000000#define HAS 阅读全文
posted @ 2011-08-17 00:22 Staginner 阅读(704) 评论(1) 推荐(1) 编辑
  2011年8月15日
摘要: POJ_3169这个题目和POJ 3159有点类似。首先我们要假定一个正向的顺序,比如规定牛从1至为正向排列,记d[i]为牛i距参照点的距离,那么对于ML的输入,有d[A]-d[B]>=-D,对于MD的输入有d[B]-d[A]>=D,前面的表达式中A都是小于B的。之后我一开始先是抽象出了一个源点0,并且d[i]-d[0]>=0,然后从0开始用SPFA判断是否有负圈,如果有负圈就输出“-1”。如果没有负圈,再从1开始用SPFA求至N的最短路,如果最后有最短路存在那么就输出d[N],否则1和N就可以离任意远的距离,则输出“-2”。虽然上面的代码AC了,但不够简洁。后来看了别人的报 阅读全文
posted @ 2011-08-15 23:17 Staginner 阅读(307) 评论(0) 推荐(0) 编辑