上一页 1 ··· 74 75 76 77 78 79 80 81 82 ··· 85 下一页
  2011年9月18日
摘要: UVA_11198 这个题目是个隐式图搜索的题目,可以把数值和符号分别存在两个数组里面,然后进行广搜即可。#include<stdio.h>#include<string.h>int st[50000][8],sign[50000][8],dis[50000];int head[1000003],next[50000];int target[8]={1,2,3,4,5,6,7,8};int isprime(int n){ int i; for(i=2;i<n;i++) if(n%i==0) return 0; return 1;}int h... 阅读全文
posted @ 2011-09-18 19:31 Staginner 阅读(356) 评论(0) 推荐(0) 编辑
摘要: UVA_11218 这个题目可以直接用回溯解决。#include<stdio.h>#include<string.h>int n,A[10],ans;int a[100],b[100],c[100],s[100];void dfs(int cur,int complete,int score){ int i; if(complete==3) { if(score>ans) ans=score; return; } for(i=cur;i<n;i++) if(!A[a[i]]&&!A[b[i]]&&!A... 阅读全文
posted @ 2011-09-18 19:30 Staginner 阅读(260) 评论(0) 推荐(0) 编辑
摘要: UVA_10887要不是在一个网站上看到了输入字符串可能为空的这一提示,我估计我又要郁闷死了……#include<stdio.h>#include<string.h>int head[10000017],next[3000000];char st[3000000][25],b[25];int hash(char *str){ int seed=31,v=0; while(*str) { v=v*seed+*(str++); } return (v&0x7FFFFFFF)%10000017;}int insert(int s){ int ... 阅读全文
posted @ 2011-09-18 01:17 Staginner 阅读(475) 评论(0) 推荐(0) 编辑
摘要: UVA_10391我终于会用字符串的哈希函数之一了……在这个哈希函数里面v&0x7FFFFFFF是为了保证v总是正的,这一点我们把16进制数写成2进制数就能很明显的看出来了,但这是v的范围仍然和int的正数范围一样大,为了节约存储空间我们可以最后让v模一个大素数,一般可以选1000003和10000019。此外这个题目如果我们判断两个字符串合成的新字符串是否出现过,这样复杂度会比较高(n^2),我们不如去判断一个字符串拆成的两半是否都出现过,这样复杂度是n*m,其中m约是字符串的平均长度。#include<stdio.h>#include<string.h>#i 阅读全文
posted @ 2011-09-18 00:15 Staginner 阅读(589) 评论(0) 推荐(0) 编辑
  2011年9月17日
摘要: UVA_188 这个题目的难度主要在理解题意上面,理解了题意之后只要按题意进行模拟并找出C即可。#include<stdio.h>#include<string.h>#include<ctype.h>int head[30],next[30];int st[30],w[30],n,C;char b[200],temp[30];int min(int x,int y){ return x<y?x:y; }int make(){ int i,j; for(i=0;i<n;i++) for(j=i+1;j<n;j++) if((C/w[i]... 阅读全文
posted @ 2011-09-17 17:33 Staginner 阅读(514) 评论(0) 推荐(0) 编辑
摘要: UVA_141由于一开始审题的问题,导致WA个不停,以后一定要加强审题!首先,棋盘是N*N的,不是4*4的。其次,在判断这个状态是否出现过时,要分别判断3种情况,但存储状态的时候只存储1种情况。#include<stdio.h>#include<string.h>int head[100007],next[1100];int st[440][250],dis[110],temp[50][50],N;char flag[5];int hash(int *A){ int i,v=0; for(i=0;i<N*N;i++) v=((v<<1)+A[i])%1 阅读全文
posted @ 2011-09-17 12:46 Staginner 阅读(401) 评论(0) 推荐(0) 编辑
摘要: UVA_704 以前即使八数码问题也没有用双向BFS,但这次状态数太多了,于是不得不使用双向BFS了。#include<stdio.h>#include<string.h>#include<stdlib.h>#define HASH 10000003int head1[HASH],next1[100000],head2[HASH],next2[100000];int st[200000][21],dis[200000],front,rear;int fa[200000],flag[200000],dir,ans,mid;int target[21]={0,3 阅读全文
posted @ 2011-09-17 00:06 Staginner 阅读(518) 评论(0) 推荐(1) 编辑
  2011年9月16日
摘要: UVA_321这个题目可以把所有灯的开关状态以及当前人所在的屋子看成一个状态,这样的话最多只有n*2^n个状态,由于n很小,还是可以接受的,直接进行隐式图搜索即可。在用Hash判重时,为了方便我们只把灯的状态用2进制转成哈希码,在判重的时候除了要灯的状态一致人所在的屋子也要一致,满足这个两个条件的状态才可以忽略。另外在搜索的时候也要注意一些条件,比如人不能熄灭当前所在屋子的灯,在进入下一个房间时一定要保证下一个房间的灯是亮的。#include<stdio.h>#include<string.h>int st[50000][11],now[50000],target[11 阅读全文
posted @ 2011-09-16 15:16 Staginner 阅读(443) 评论(0) 推荐(1) 编辑
  2011年9月11日
摘要: UVA_10085这个题目和八数码问题基本是一样的,只不过八数码问题是求变成指定图形所需的最少步骤,而这个问题是从指定图形出发,去找一个图形使得其按少步骤操作以得到指定图形所需的步骤是所有图形中最多的。从代码的角度讲,八数码问题的广搜的while循环是在遇到指定图形时退出的,而这个问题的while循环只能是在front=rear时退出,这样才算搜完了所有情况。对于八数码问题的相关知识可以参考刘汝佳白书的P132。#include<stdio.h>#include<string.h>#define HASH 100003int st[1000000][9],fa[1000 阅读全文
posted @ 2011-09-11 22:02 Staginner 阅读(644) 评论(0) 推荐(0) 编辑
摘要: UVA_10422一开始本来打算用BFS+Hash判重去做,但是空格有些不好处理,后来发现由于限定了解的层数最多为10,那么直接用DFS也不是很困难的事情。如果直接DFS,节点数是8^10,还是有些多了,但我们可以进行适当的剪枝,我想的剪枝策略有下面两个:①当n=9时,如果空格与中心的曼哈顿距离不等于3,那么就不用再往下搜了,肯定无解。如果曼哈顿距离为3,那么第10步空格一定会走到中央。②对于当前状态,假如已经移动了n步,我们统计所得的棋盘主对角线及其上部白马的个数为p,如果p-2>10-n,也不用继续往下搜了,肯定无解。因为上半部分白马的容量最多为2,p-2为多余的白马,剩余可走步数至 阅读全文
posted @ 2011-09-11 20:14 Staginner 阅读(589) 评论(0) 推荐(0) 编辑
上一页 1 ··· 74 75 76 77 78 79 80 81 82 ··· 85 下一页