随笔分类 - Uva
摘要:图的搜索,双重搜索题意:(折腾的UVA又是好难懂的题意),给你一个h行w列的矩阵输入(标准的),注意输出w h,别颠倒过来。然后只有三种点 '*' , '.' , 'X'其中X和*一起称为区域I,在区域I中相连的X称为区域II , 输出就是输出m个数字,其中m就是区域I的个数,这m个数字中第i个数字num[i]表示某块区域I一面又多少个区域II其中相连是两个格子有公共边,只有点不行,所以对于一个格子而言有4个相连的格子,分别就是上下左右另外区域I可能是任意形状的,可以看samplesample中就是有4块区域I左上角的区域I有两个X,但是这个两个
阅读全文
摘要:一样的题目,看poj 1386 Play on Words即可
阅读全文
摘要:推荐技术公众号:不爱睡觉的大猪 题意:给你n个珠子,一个珠子分为两半有两种颜色,用1到50来表示50种不同的颜色。把这些珠子串起来,两个紧挨着的珠子要满足一个条件就是接触的那部分颜色要相同 例如(1,2)(2,4),两个珠子的接触部分颜色相同都为2。当然,因为珠子最后是连成环的,第一个珠子和最后一个
阅读全文
摘要:题目翻译:1976年“四色定理”在计算机的帮助下被证明。 这个定理宣告任何一个地图都可以只用四种颜色来填充, 并且没有相邻区域的颜色是相同的。现在让你解决一个更加简单的问题。 你必须决定给定的任意相连的图能不能够用两种颜色填充。 就是说,如果给其中一个分配一种颜色, 要让所有直接相连的两个节点不能是相同的颜色。 为了让问题更简单,你可以假设:1. 没有节点是连接向它自己的。2. 是无向图。 即如果a连接b, 那么b也是连接a的3. 图是强连接的。就是说至少有一条路径可走向所有节点。方法一:广搜BFS由题目可知,对于每个结点,所有和它相接的点必须和这个点颜色不一样。那么,很自然可以用广搜来做:
阅读全文
摘要:UVA 其实挺折腾的,题目超长,然后题意可能很水,输入输出又奇葩,当做是磨练其实是最短路径的裸题。固定有20个点点,输入分为两部分,前部分有19行,每一行先输出一个n,表示这行有n个数字,然后输入n个数字。第i行输出的数字v表示i和v之间有边而且是无向边,所有边的权值都是1。输入的后部分是先输入一个m,表示有m个查询,下面m行输入点u,v输出两点间的最短路径显然就是Floy算法的裸题。但是新学了spafa,把spfa也放上来注意的是有20个点从1标号到20,但是输入只有19行,再者就是输出的格式也要注意,本题1Y,当做是练手啦SPFA//先给出spafa算法//这个代码中是得到了邻接矩阵后再输
阅读全文
摘要:搜索水题,其实就是一个图的遍历(因为放在数据结构图专题中)给你一个图,以一整行的"_________"作为这个图的结束然后"X"表示不能到达,空格是能到达的,"*"也是可以到达的,并且是一个起点,要求从所有的起点出发,能到达的地方都标记为"#"然后输出标记后的整个图,"_______"也是要输出的另外注意这个图不一定是一个矩阵,可能是不规则的,例如XXXXXXXXXX X XX * XX X XXXXXXXXXXX XX XX XXXXXX_____当然这些都是没有关系的,就直接遍历好了,已经标
阅读全文
摘要:题意:一个三维方块,给出高长宽,并且按照从最低面一层(或者从最顶面一层)到最高一层逐层给出这个方块的信息。S表示起点E表示终点,#表示这个格子不能走, .表示这个格子能走,走的方向有6个,前后左右上下。能是否能从起点走到终点,若能输出最少的步数首先想到的DFS+剪枝,后来TLE了,才自己脑子又进水了,应该用BFS,因为剪枝的话效率不高,而且题目求最小步数,显然符合BFS的特点从起点开始,将它能走的6个方向的格子且满足条件的格子入队,满足条件是指,这个格子还在方块内,而且能走,而且没有走过一开始没有记录一个格子是否走过就TLE了,又脑子进水了显然是要记录的………………如果队中某个格子就是终点的格
阅读全文
摘要:其实题意不是很明白,看了别人的解题报告然后按照思路来实现,最后AC了,但是对于题意还是很有问题判断是否有欧拉回路,图要连通(用并查集来处理),然后所有顶点的度数为偶数在这个博客中http://www.cnblogs.com/penseur/archive/2011/02/28/1967412.html说输入的边中要包含所有的点才是存在,但是按照这个AC代码以及网上找回来的大部分代码表明是不需要包括所有代码的例如10 28 99 8输出Possible按照这个AC代码的意思应该是前面的点可以不存在,但是一旦出现了第i个点,那么必须从第i个点到第n-1个点都存在,而且图连通,度为偶数,才存在欧拉回
阅读全文
摘要:图论入门题,找多少个八连块,简单的dfs解决//给出一个m*n的矩阵,有些方格染色,一个方格的邻接方格有8个,就是它四周的八个//一个染色的方格的邻接方格中也有染色的话那么把他们看做是一起的,都归为一个八连块//题目要找这个矩阵中有多少个八连块#include <stdio.h>#include <string.h>#define N 110#define M 110bool a[M][N],vis[M][N];int m,n;void dfs(int i , int j){ if(!a[i][j] || vis[i][j]) return ; vis[i][j]=1;
阅读全文
摘要:很简单的骑士周游问题,简单的BFS一个骑士在当前位置的话可以像8个方向走,至于骑士是怎么走的可以百度一下记录起点和终点的行列并算出它的标号(整个棋盘是8*8的,按行优先去编号从1到64,所以每个格子都会有一个唯一的编号)走了8个方向记录下每个方向的编号,每得到一个编号就判断和终点编号是否相同,是的话就已经走到了,跳出,否则的话这个格子入队另外就是记录步数,就是代码中的k另外要注意判断起点和终点相同的情况,都是输出0#include <stdio.h>#include <string.h>#include <queue>#define MAX 70using
阅读全文
摘要:拓扑排序的裸体,全裸的那种一点变形和要求都没有用DFS来实现//用dfs解决拓扑排序//用一个标记数组vis来标记//0表示还没有访问过,1表示正在访问,2表示已经访问过并且存入拓扑数组#include <stdio.h>#include <string.h>#define MAX 110int g[MAX][MAX],vis[MAX];int n,m,c,top[MAX];int dfs(int u){ int v; vis[u]=1; for(v=1; v<=n; v++) if(g[u][v]) { if(vis[v]==1) return 0; ...
阅读全文
摘要://提交通过,时间0.008,本题主要是字符串处理,以及层序建树,以及前序(DFS递归)//遍历3个知识点,细节问题是字符串的处理,以及空树的处理#include <stdio.h>#include <string.h>#define MAX 40010struct tree{ char data; int l,r; //最左边的孩子下标和最右边的孩子下标 int x,y; //它自身在最开始的字符矩阵中的列和行,x是列,y是行}tree[MAX];char string[210][210];char stack[MAX]; int top,line;void inpu
阅读全文
摘要://水题,直接模拟#include <stdio.h>#include <string.h>int string[10],x[10],level;int numnode[10]={1,2,4,8,16,32,64,128};char leaf[300];int main(){ int T=0,n,m,i,j,p,q,num,level; char ch,temp[10],ans[300]; while(scanf("%d",&n)!=EOF && n) { getchar(); T++; printf("S-Tree
阅读全文
摘要://又是DFS,其实就是建树然后一边建一般判读,但是很多这种题都不一定真刀真枪地//把建树语句写出来,只要是这种思路即可,这样就可以减少时间#include <stdio.h>int ok;int dfs(){ int w1,d1,w2,d2; scanf("%d%d%d%d",&w1,&d1,&w2,&d2); if(w1 && w2 && d1 && d2) { if( (w1*d1) != (w2*d2) ) {ok=0; return 0;} else return (w1+
阅读全文
摘要://思路:一遍输入扩展前序一遍建树,在建树过程中记录该结点的水平坐标,根结点的坐标为0,往左减1,往右加1,最后会的到一个最左侧坐标L,最右侧坐标R建树之后见遍历、,遍历过程中,统计各个坐标的值并求他们的和保存在数组中,但是左侧的坐标是负值,数组没有负值,所以开一个二维数组sum[2][MAX],第一行对应右侧的坐标,从1到R,第二行对应左侧的坐标,从1到-L,也就是将左侧的坐标在统计时取绝对值,然后累加求和.思考可知建树和遍历的过程实际上相同所以干脆把遍历去掉,直接建树,建树过程中就求水平坐标并累计求和//注意输出的格式,时间也不太好,0.100上下#include <stdio.h&
阅读全文
摘要://提交通过,0.092,不算太快,先给出代码#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 10010#define INF 100000010struct treenode{ int data,lchild,rchild,level;};int *start,*flag;int min,leaf,pre,value;int input(int *post , int *ind){ int i,len; char ch; i=0; while(1) { if(...
阅读全文
摘要://难得的1Y,完全水过去,硬生生地把式子搞出来,代码写得很差,但是数据较小而且判断//较多所以省去不少时间#include <stdio.h>#include <string.h>#include <algorithm>#define MAX 150using namespace std;char string[150],temp[150];struct elemt{ char ch; int data; int flag;}a[MAX]; //flag=0表示这个元素在运算结束之后不需要变化,1表示运算后加1,-1表示运算后减1,所以同意+flag即可i
阅读全文
摘要:这道题最难的地方是怎么计算最后的结果,建树不难,就按照前序建树即可,DFS遍历也不难,要算出每棵是中黑色像素也不难,但问题是怎么确定最后的结果//一下代码可以建树,可以DFS遍历,可以计算每棵树的黑点个数,但不能解出//本题,要做出一些改动//提交通过,时间不错,在0.008到0.020之间#include <stdio.h>#include <string.h>#include <stdlib.h>#define LEN sizeof(struct tree)int weight[7]={0,1024,256,64,16,4,1};struct tree{
阅读全文
摘要:将原来的代码改了一个BUG即是存在负数后就AC了,但是时间不好,0.112实际上本题就是由扩展前序序列来建树,然后遍历,算路径的题目,考查了二叉树的基本知识,很好#include <stdio.h>#include <string.h>#include <stdlib.h>#define LEN sizeof(struct BTree)#define MAX 10010char num[MAX][20],stack[MAX];struct BTree{ int data; struct BTree *lchild,*rchild;}*pre;int top,
阅读全文
摘要:算法分析:构建表达树后可以发现,用栈实现逆波兰表达式其实是用后序遍历的方式来输入树的所有结点,如果用队列实现是用层序遍历的方式来输出所有结点,所以本题可以转化为已知后序遍历的序列然后构树再用层次遍历的方式输出要构建二叉树至少知道两个遍历序列,或者设法构建扩展二叉树显然该题由小写字母就可以知道是树的根结点,可以构建成为扩展二叉树,至此,建树成功,即可层序遍历的方式输出结点(先在输入时将遍历序列变成扩展遍历序列)2xyPzwIM ##x##yP##z##wIMabcABdefgCDEF ##a##b##cAB##d##e##f##gCDEF//然后由扩展后序遍历序列来构建二叉树,然后用层序遍历的方
阅读全文