摘要:
UVA_784 这个题目是个相对容易的搜索题目,同时在搜索的过程中也无需再用vis数组标记是否访问过了,因为染过色就相当于访问过了。#include<stdio.h>#include<string.h>int a[50][100],n;char b[100];int dx[]={-1,1,0,0},dy[]={0,0,-1,1};void dfs(x,y){ int i,newx,newy; for(i=0;i<4;i++) { newx=x+dx[i]; newy=y+dy[i]; if(a[newx][newy]==1) ... 阅读全文
摘要:
UVA_657首先可以用一个数组a[][]来存储图,其中“.”为-1,“*”为0,“X”为1。为了确保能把每个骰子都遍历完,我们可以使用两个判断是否访问的数组vis0[][]和vis1[][],其中vis0为是否遍历过骰子上的点(包括X和*),由深搜函数dfs0使用,vis1表示是否在搜索X时搜过当前的X。当我们遍历时候,如果遇到*或者X就进入dfs0,如果当前点为X时再跳入dfs1,每当在dfs0中跳入dfs1并跳出时,骰子的点数加1,当所有dfs0结束的时候,骰子数加1。#include<stdio.h>#include<string.h>#include<s 阅读全文
摘要:
UVA_572这是个相对容易的搜索题目,只要依次遍历图,遇到没有访问过的“@”就开始广搜或者深搜,直到把8个方位相邻的“@”都搜完位置。每进入一次搜索,总数就加1。#include<stdio.h>#include<string.h>int a[110][110],vis[110][110],num;char b[110];int dx[]={-1,1,0,0,-1,-1,1,1};int dy[]={0,0,-1,1,-1,1,-1,1};void dfs(int x,int y){ int i,newx,newy; for(i=0;i<8;i++) { ne. 阅读全文
摘要:
UVA_307相当于重温了一下POJ 1011这个题目,剪枝在这个题目中显得尤为重要。对于这道题而言,剪枝的策略一般有下面6个:①先将木棒长度从大到小进行排序,这样便于后面的选择和操作,是后面一些剪枝算法的前提。②在枚举原木棒长度时,枚举的范围为max与sum/2之间,如果这个区间内没有找到合适的长度,那么最后原木棒的长度只能是sum。③枚举的原木棒的长度只能是sum的约数。④在深搜过程中,如果当前木棒和前一个木棒的长度是一样的,但是前一个木棒没有被选上,那么这个木棒也一定不会被选上。⑤在深搜过程中,如果当前是在拼一根新木棒的第一截,但如果把可用的最长的一根木棒用上后不能拼成功的话,那么就不用 阅读全文