2011年9月6日
摘要: UVA_167 这个题目本质上就是刘汝佳的白书上P125的八皇后问题。#include<stdio.h>#include<string.h>int a[10][10],b[10],ans;void dfs(int cur){ int i,j,ok,temp; if(cur==8) { temp=0; for(i=0;i<8;i++) temp+=a[i][b[i]]; if(temp>ans) ans=temp; return; } for(i=0;i<8;i++)... 阅读全文
posted @ 2011-09-06 17:07 Staginner 阅读(316) 评论(0) 推荐(0) 编辑
摘要: UVA_165由于h+k<=9,数据量不是很大,所以可以直接枚举、深搜。深搜函数一共有两个,其中一个用来枚举能够连续达到的值,如果通过已有面值可以拼出当前值,则可以继续保持已有面值的状态并继续深搜,或者可以创造一个新的面值等于当前值并继续深搜,当两种手段都不能达到拼出当前值的目的时,当前值减1即为现有面值的状态下能够拼出的最大值;另一个深搜函数用来做判断是否可以通过已有面值拼出当前值的工作,只需要依次选择是否选用当前面值的邮票并使总张数小于h即可,当某一时刻可以拼出当前面值时返回1,所有情况都不能拼出当前面值时则返回0。#include<stdio.h>#include< 阅读全文
posted @ 2011-09-06 16:37 Staginner 阅读(856) 评论(0) 推荐(1) 编辑
摘要: UVA_10012这个题目WA得满痛苦的,一开始不知道为什么会WA,后来意识到原来是少考虑了两个相邻的圆半径差别很大的情况,也就是说一个大圆下面可能可以放很多小圆,这时就又没头绪了。后来看了别人的代码后,给了我很大的启发,原来可以在递归的过程中多引入一个表示当前放置的圆的圆心坐标的数组,来辅助计算。我们以左下角为原点建立直角坐标系,暂且假设第一个圆是紧贴左下角放置的,然后用深搜枚举每个位置可能放的圆,并计算放置这个圆的圆心坐标。计算的时候要依次假设当前圆和前面的某一个圆相切,并依此来计算当前圆的圆心坐标,最后取所有结果的最大值,这样就得到了当前圆的放置时的实际的圆心坐标。在放置完所有圆后,实际 阅读全文
posted @ 2011-09-06 12:25 Staginner 阅读(757) 评论(0) 推荐(1) 编辑
  2011年9月5日
摘要: UVA_331本来打算先用BFS找到最少的交换次数,但发现情况种数太多,数组放不下,后来发现原来用冒泡法排序的过程对应的就是最少的交换次数。得到最少的交换次数之后,只要限定深搜的层数,然后递归寻找一共有多少种交换方案即可。#include<stdio.h>#include<string.h>#include<stdlib.h>int a[5],target[5],num,n,ans;void dfs(int cur,int p[]){ int i,k,q[5]; if(cur==num) { if(memcmp(p,target,sizeof(target) 阅读全文
posted @ 2011-09-05 18:12 Staginner 阅读(403) 评论(0) 推荐(0) 编辑
摘要: UVA_10344由于计算顺序已经给定了,那么便只需要依次枚举符号和符号后面ai的值即可,其中符号是可以重复使用的,但每个ai只能使用一次。当递归到所有ai都已使用时就检查计算结果是否为23即可。#include<stdio.h>#include<string.h>int a[10],vis[10];int dfs(int cur,int tot){ int i,j,t; if(cur==5) { if(tot==23) return 1; else return 0; } for(i=0;i... 阅读全文
posted @ 2011-09-05 16:27 Staginner 阅读(264) 评论(0) 推荐(0) 编辑
摘要: UVA_301 我们可以取一个数组p来记录列车到每一站时最多能容纳的乘客量,之后对输入的数据按起始车站升序排列,然后按顺序枚举每一个订单。如果当前订单的乘客量小于或等于列车到该站时能容纳的乘客量,则该订单可以被接受,更新p并进行递归即可。#include<string.h>#include<stdio.h>#include<stdlib.h>int n,d,s,ans;int begin[30],end[30],num[30],r[30];int cmp(const void *_p,const void *_q){ int *p=(int *)_p; in 阅读全文
posted @ 2011-09-05 01:13 Staginner 阅读(344) 评论(0) 推荐(0) 编辑
  2011年9月4日
摘要: UVA_539 这个题目可以直接用深搜去解。#include<stdio.h>#include<string.h>int G[30][30],vis[30][30];int n,m,ans;void dfs(int i,int tot){ int j,flag; flag=0; for(j=0;j<n;j++) if(G[i][j]&&!vis[i][j]) { flag=1; vis[i][j]=1; vis[j][i]=1; dfs(j,tot+1); ... 阅读全文
posted @ 2011-09-04 21:52 Staginner 阅读(274) 评论(0) 推荐(0) 编辑
摘要: UVA_639这个题目可以先将横向相连的“.”看作一个块,并记录下块开始和结束的坐标,每个块中只能放一个rook。之后便顺序枚举每种方案并判断rook是否可以放在假设的位置,如果可以就继续深搜。当搜完搜有的块之后,就可以比较放置的rook总数与ans了,如果比ans大,则更新ans的值。#include<stdio.h>#include<string.h>int ans,n,num,dx[]={-1,1,0,0},dy[]={0,0,-1,1};int begin[20],end[20],a[10][10],vis[10][10];char b[10];int dfs( 阅读全文
posted @ 2011-09-04 19:21 Staginner 阅读(361) 评论(0) 推荐(0) 编辑
摘要: UVA_216 这个题目可以直接深搜,深搜的边界就是加入line的点为n,当总长度比标记过的长度小的时候,即可更新记录line的数组和总长度。#include<stdio.h>#include<string.h>#include<math.h>int n,x[10],y[10],vis[10];int temp[10],ans[10];double total;void dfs(int cur,double t){ int i; double k,t_x,t_y; if(cur==n) { if(t<total) { t... 阅读全文
posted @ 2011-09-04 11:08 Staginner 阅读(388) 评论(0) 推荐(0) 编辑
摘要: UVA_10474这个题目可以用Hash的思想,首先读入Marbles,进行排序,之后遍历一遍Marbles数组并给hash数组赋相应的值,其中hash[i]表示标号为i的Marble第一次出现的位置。 之后每读入一个Q,只需要判断对应的hash数组中的元素是否被赋值,并进行相应的输出即可。#include<stdio.h>#include<string.h>#include<stdlib.h>int a[10010],hash[10010];int cmp(const void *_p,const void *_q){ int *p=(int *)_p; 阅读全文
posted @ 2011-09-04 10:25 Staginner 阅读(507) 评论(0) 推荐(0) 编辑