LeeBlog

导航

随笔分类 -  DFS

福州大学 括号问题
摘要:这题当时比赛的时候想到是深搜,但当时深搜做得不多,没做得出,后来看以大牛代码才会写,主要是判断条件写得好。#include<stdio.h>#include<string.h>char str[20];int l,cnt;void DFS( int k,int num ){ if( num < 0 )//右括号不能多于左括号 return ; if( k == l ) { if( num == 0 )//当左边跟右边的括号相等且刚好到最后一个,就是一中符合条件的可能 ++cnt; return; } if( str[k] == '(' ) DFS( 阅读全文

posted @ 2011-05-11 11:19 LeeBlog 阅读(176) 评论(0) 推荐(0)

HDU 1312 Red and Black
摘要:这题忒easy了。。。。直接搜吧。。 都不用回溯的#include<stdio.h>#include<string.h>int map[25][25],des[25][25],n,m,sx,sy;void DFS( int y,int x ){ if( map[y][x] == '#'||des[y][x]||y > n || x > m ) return ; des[y][x] = 1; DFS( y - 1,x ); DFS( y + 1,x ); DFS( y,x - 1 ); DFS( y,x + 1 ); }int main( ){ 阅读全文

posted @ 2011-05-11 10:29 LeeBlog 阅读(180) 评论(0) 推荐(0)

HDU 1010 Tempter of the Bone
摘要:这题如果是神搜的一基本题目,每次都向四个方向神搜就行了,不过要考虑剪枝,要用奇偶剪枝,否则TLE,还有用一个标记f,标记当前是否已找到来剪枝。如果还想减少时间就可以在输入时做一个标记,看当前有多少个可以走的点,如果可以走的点小于总时间t那么肯定是NO,这样要减少很多饿。。。。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int n,m,t,sx,sy,ex,ey,f;int maz[10][10],des[10][10];void DFS( int y,i 阅读全文

posted @ 2011-05-11 09:49 LeeBlog 阅读(223) 评论(0) 推荐(0)

HDU 2181 哈密顿绕行世界问题
摘要:这个就是一深搜,不解释,还有,测试数据太弱了。#include<stdio.h>#include<string.h>int map[23][4],des[23],num[23],f,n;void DFS( int p,int nu ){ if( nu == 20 && ( map[p][1] == n || map[p][2] == n || map[p][3] == n ) ) { printf( "%d: ",++f ); for( int i = 0; i < 20; ++i ) printf( "%d &quo 阅读全文

posted @ 2011-05-10 23:23 LeeBlog 阅读(559) 评论(0) 推荐(0)

HDU 2553 N皇后问题
摘要:这题跟其实是以DFS经典题,如果按一般思路一行一行来选,那样会灰常暴力,但是仔细思考可得这题可简化思路,因为没行只能放一个,所以只要搜索N个就行了。。。。。 而对于每一个只要判断跟前面是否有冲突就行了( DP 思想,分步来 )。#include<stdio.h>#include<string.h>int n,map[20],des[20],cnt,num[11];void DFS( int num ){ if( num == n + 1 ) { ++cnt; return ; } for( int i = 1; i <= n; ++i ) { if( !des[i 阅读全文

posted @ 2011-05-10 19:18 LeeBlog 阅读(236) 评论(0) 推荐(1)

HDU 2614 Beat
摘要:其实这题是一DFS的简单题,但是题目意思,是在让人蛋痛啊!这题就是解决一个问题后,解决下一个问题的时间一定要比解决这题的多或者等于这题。。。。。但那英文是在太难看;第1个是第0个,时间为0,然后解决下一个。代码如下#include<stdio.h>#include<string.h>int n,des[20],max;int num[20][20],N[20];void DFS( int p,int val,int nu ){ int f = 0; for( int i = 1; i <= n; ++i ) { if( !des[i] && ( n 阅读全文

posted @ 2011-05-09 19:03 LeeBlog 阅读(388) 评论(0) 推荐(0)

HDU 2660 Accepted Necklace DFS || 多重背包
摘要:这题是以多重背包题..... 不过还不会多重... 只会简单的... 这里用DFS做就行了..... 不过这里如果不把当前位置传下去就会超时的噢... 我开始一直TLE 后来把当前状态传下去就A了15MS#include<stdio.h>int V[25],W[25];int des[25],n,k,we,max,dp[25][25];int inf = 0x7fffffff;void DFS( int p,int num,int val,int wei )//p不可少,否则超时.... 悲剧额....{//以后做这种深搜的一定先考虑要不要传递当前状态.. 以此来减少深搜时间 if 阅读全文

posted @ 2011-05-08 09:58 LeeBlog 阅读(306) 评论(0) 推荐(0)

HDU 1035 Robot Motion
摘要:一纯水题..... 直接深搜并记忆化加标记#include<stdio.h>#include<stdlib.h>char map[1005][1005];int des[1005][1005],m,n,s,f1,f2,inf = 0x7fffffff,dep[1005][1005],s1,s2,s3;void DFS( int y,int x,int step ){ if( des[y][x] )//若遇到回路 { f2 = 1; s2 = step; s3 = dep[y][x]; return ; } if( f1 || map[y][x] < 0 )//若遇 阅读全文

posted @ 2011-05-08 08:28 LeeBlog 阅读(246) 评论(0) 推荐(0)

HDU 1258 Sum It Up
摘要:这题郁闷了,排序过不了,后来仔细想想不用排序, 于是果断删了,没想到删了再杭电能过,在北大不能过,真郁闷了这题是以简单DFS,在搜到时把结果存起来,然后再暴力搜索,看是否已存在这样的sum,最后一次性输出来就o了.先贴一神代码把.... 这个hdu poj 都能过( 这个算法非常好.以后对于组合问题都能这么干了 )#include<stdio.h>int t,n,num[20],flag,res[20];void DFS( int p,int s,int nu ){ if( s == t ) { flag = 1; for( int i = 0; i < nu; ++i ) 阅读全文

posted @ 2011-05-04 22:40 LeeBlog 阅读(218) 评论(0) 推荐(0)

HDU 1016 Prime Ring Problem DFS + 记忆化搜索
摘要:说实话,这题真没做出来,思路有,但是有问题一直不能解决,后来别人提供的思路.不多说了....这题就是要求形成一个环,没两个相邻的数之和不能为素数,当然最后一个要考虑他跟第一个的关系,这里的DFS其实只要递归一个东西,而我递归的东西却一直不对,主要受变形课影响,其实递归的东西肯定是当前的数目,然后把当前的数存在数组里,以便下一次递归的时候可以跟这一次的数比较....#include<stdio.h>#include<string.h>int n,num[25],des[25];int gcd( int n ){ int f = 0; if( n == 2 || n == 阅读全文

posted @ 2011-05-04 20:04 LeeBlog 阅读(227) 评论(0) 推荐(0)

hdu 1181 变形课
摘要:#include<stdio.h>#include<stdlib.h>#include<string.h>int len,map[26][ 26 ],des[26],a,b,f = 0,m;char ch[1000];void DFS( int n ){ if( f ) return ; if( n == 'm' - 'a' ) { f = 1; return; } for( int i = 0; i < 26 ; ++i ) { if( n != i && map[n][i] == 1 ) { if( 阅读全文

posted @ 2011-03-01 22:40 LeeBlog 阅读(208) 评论(0) 推荐(0)