2011年8月17日

摘要: 一直忘了来更新了……先放个water。题目大意:从点1出发,每次只能选择比当前点更接近点2的点移动,问一共有多少种走法。思路:先用spfa或者其他最短路算法算出所有点到点2的距离,之后从点1搜索即可。 我用的spfa找最短路之后记忆化搜索。 1 #include <cstdio> 2 #include <iostream> 3 #include <queue> 4 5 #define SIZE 50000 6 #define INF 0x3F3F3F3F 7 using namespace std; 8 struct path 9 {10 int to,ne 阅读全文
posted @ 2011-08-17 19:02 死线之蓝 阅读(405) 评论(0) 推荐(0) 编辑

2011年5月9日

摘要: 广搜两遍找出Y和M到每个KFC的最短距离,然后找一个和最小的输出……本来打算两个人一起走,碰头就输出。结果发现如果最短距离的KFC离某一个人很近,但离另一个很远,而又有一个KFC在两人之间的时候,答案就不对了。结果只能用这种笨办法了。#include <stdio.h>#include <string.h>#define INF 9999typedef struct{ int x,y,t;}QUEUE;char map[203][203];const int dirc[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};int n,m,yVisit[ 阅读全文
posted @ 2011-05-09 16:08 死线之蓝 阅读(440) 评论(0) 推荐(0) 编辑
摘要: 其实就是广搜+广搜或者广搜+深搜真正移动的是箱子,但是要移动箱子需要满足几个条件。1.移动方向上没有障碍。(废话了……)2.箱子后方没有障碍。3.人可以到达箱子后方的地方。这样就可以写出搜索的条件了 1 #include <stdio.h> 2 #include <string.h> 3 typedef struct{ 4 int bX,bY,pX,pY,t; 5 }BOXQUEUE; 6 typedef struct{ 7 int x,y; 8 }PEOQUEUE; 9 BOXQUEUE boxQ[1000]; 10 PEOQUEUE peoQ[1000]; 11 c 阅读全文
posted @ 2011-05-09 15:59 死线之蓝 阅读(2711) 评论(0) 推荐(1) 编辑
摘要: 广搜+状态压缩用一个三维的hash来标记当前位置和拥有的钥匙,由于钥匙一共10把,所以一共有2^10种组合,开到hash[21][21][1025]即可。好像除了用位运算来记录钥匙串没什么好说的了…… 1 #include <stdio.h> 2 #include <string.h> 3 typedef struct{ 4 int x,y,t; 5 int key; 6 }QUEUE; 7 QUEUE q[500000]; 8 const int dirc[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; 9 int n,m,t;10 bool 阅读全文
posted @ 2011-05-09 15:50 死线之蓝 阅读(392) 评论(0) 推荐(0) 编辑

2011年4月26日

摘要: 第四棵线段树,其实推倒重写了好几遍。说实话一点也不simple……题目中写的增量c在-1e4到1e4之间,操作最多1e5,那c应该不会超过1e9才对,结果不用__int64存增量就会一直wa……基本上还是线段树,开始建树的时候最好先把每个点的值接收进来再建,免得多更新一次。然后用一个变量来存增量,一个变量来存区间和。执行加操作的时候只要加到对应的区间就可以了,把增量存在该区间的增量上就返回,避免每次都加到根节点浪费时间。执行查询操作的时候每次向下传递增量信息,查到对应区间返回即可。变量名起的太长,自己看着都觉得恶心了…… 1 #include <stdio.h> 2 typedef 阅读全文
posted @ 2011-04-26 16:36 死线之蓝 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 继续线段树。开始直接统计无悬念超时,后来看了某大牛的代码用了位运算把颜色的种类存到一个整形变量里才过。 1 #include <stdio.h> 2 #include <string.h> 3 typedef struct{ 4 int left,right,color; 5 bool cover; 6 }SegTree; 7 SegTree board[450000]; 8 void createSegTree(int root, int left, int right){ 9 int mid;10 board[root].left = left;11 board[r 阅读全文
posted @ 2011-04-26 13:37 死线之蓝 阅读(312) 评论(0) 推荐(0) 编辑

2011年4月25日

摘要: 第二个线段树,用malloc申请果断超内存,自己写了个销毁树的函数果断超时。最后还是默默地用数组实现了。2174ms 慢的可怕…… 1 #include <stdio.h> 2 3 typedef struct{ 4 int left,right,max; 5 int lChild,rChild; 6 }SegTree; 7 SegTree list[800000]; 8 9 int max(int a, int b){10 return a > b? a:b;11 }12 void createSegTree(int root, int left, int right){1 阅读全文
posted @ 2011-04-25 22:40 死线之蓝 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 第一次学线段树,从头到尾敲了快一小时。其实add和sub是没必要写的,不过想想反正当练手,就敲上去了。 1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 5 typedef struct Seg_Tree{ 6 int left,right; 7 int amount; 8 struct Seg_Tree *lChild, *rChild; 9 }SegTreeNode,* SegTree; 10 11 SegTree createSegTree(int left, int 阅读全文
posted @ 2011-04-25 21:43 死线之蓝 阅读(878) 评论(0) 推荐(0) 编辑
摘要: 基本上就是深搜……利用3个数组分别来表示行列宫有哪些数存在,用1个数组记录所有需要填数的位置,深搜过去即可 1 #include <stdio.h> 2 #include <string.h> 3 #include <time.h> 4 int rowok[9][10],colok[9][10],miyaok[9][10]; //用来记录行列宫有哪些数字 5 int sudoku[9][9],place[81][2],p,n; //place用来记录哪些位置需要填数 6 int search(int x, int y){ 7 int i,j; 8 if(p 阅读全文
posted @ 2011-04-25 13:08 死线之蓝 阅读(551) 评论(0) 推荐(0) 编辑

2011年4月20日

摘要: 结点名是字符串的最短路,处理好了用dijkstra即可自己写了个非常丑陋的处理……起点和终点是同一点的时候还得判断。#include <stdio.h>#include <string.h>#define INF 999999999#define MAX 155int N,map[MAX][MAX],stationnum;char station[MAX][35];int input(){ int j; char stationname[35]; scanf("%s",stationname); for(j = 0; j < stationnu 阅读全文
posted @ 2011-04-20 13:05 死线之蓝 阅读(309) 评论(0) 推荐(0) 编辑

导航