2011年9月3日
摘要: UVA_10098 这个题目实际上就是刘汝佳白书上P116上的枚举排列问题。#include<stdio.h>#include<string.h>#include<stdlib.h>char b[15];int cmp(const void *_p,const void *_q){ char *p=(char *)_p; char *q=(char *)_q; return *p-*q; }void dfs(int n,char *A,int cur){ int i,j,c1,c2; if(cur==n) printf("%s\n",A) 阅读全文
posted @ 2011-09-03 09:30 Staginner 阅读(246) 评论(0) 推荐(0) 编辑
摘要: UVA_146这个题目实际上就是要求生成下一个字典序排列。如果要是恰好比现在的字符串大一点点的话,肯定是最后连续的几位变动得越少越好,那么不妨从后往前搜,直到后面一个字符要大于前面一个字符,这时从前面那个字符一直到字符串末尾便是最小的变动区间。之后在这个区间里找到恰好比首字符大一点的字符和首字符进行交换,然后将这个区间除首字符之外按字典序排列即可。#include<string.h>#include<string.h>#include<stdlib.h>char b[60];int cmp(const void *_p,const void *_q){ ch 阅读全文
posted @ 2011-09-03 09:07 Staginner 阅读(304) 评论(0) 推荐(0) 编辑
  2011年9月2日
摘要: UVA_131 这个题目的难度不是很大,只要能够细心的枚举每种情况即可。 在枚举的时候,首先用子集生成的位运算算法确定最后手里的牌,然后再把需要添加的牌加入,之后就是依次考虑每种情况了。#include<stdio.h>#include<string.h>char *b="A23456789TJQK";char *c="CDHS";char ans[][20]={"straight-flush","four-of-a-kind","full-house","fl 阅读全文
posted @ 2011-09-02 20:22 Staginner 阅读(596) 评论(0) 推荐(0) 编辑
摘要: UVA_11205一开始在理解题意上面产生了严重的问题,后来看别人报告说是在给定的矩阵里面选出最少的列使得能区分每一行,还说实际上就是刘汝佳书上P120的子集生成问题。后来大概过了一天我终于搞明白了“在给定的矩阵里面选出最少的列使得能区分每一行”是什么意思,之后就是枚举所有可能的列的组合,如果符合要求就更新表示最少列数的min即可。#include<stdio.h>#include<string.h>int a[110][20],P,N,hash[100000],fac[20];int main(){ int i,j,k,t,min,sum,num,ok; fac[0] 阅读全文
posted @ 2011-09-02 17:10 Staginner 阅读(869) 评论(0) 推荐(0) 编辑
  2011年8月26日
摘要: POJ_3080这个题目直接暴力枚举就可以过了。一开始只看了Sample就开始做题了,结果忽视了输出的碱基至少要有3个这个条件。以后无论什么样的题目都要仔细审题!#include<stdio.h>#include<string.h>char b[15][70];char ans[70],temp[70];int main(){ int i,j,k,n,t,p,q,r,s,len,match,find,ok; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i 阅读全文
posted @ 2011-08-26 00:35 Staginner 阅读(248) 评论(0) 推荐(0) 编辑
  2011年8月25日
摘要: POJ_2503之前集训的时候做过这道题目的,这次想换个方法,但自己写的哈希函数毫不犹豫地挂掉了。于是重操旧刃,写了qsort+二分查找的代码。一定要找个时间系统学一下常见的哈希函数!#include<string.h>#include<stdlib.h>#include<stdio.h>char b[15],english[100010][15],other[100010][15];int r[100010];int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q=(int *)_q 阅读全文
posted @ 2011-08-25 23:51 Staginner 阅读(252) 评论(0) 推荐(0) 编辑
  2011年8月23日
摘要: POJ_1321 这个题目把棋子的坐标依次存进数组里,然后再分别用两个数组记录行和列有哪些已经被占用了,之后便从第一个棋子开始深搜即可,深搜函数带两个参数p,#include<stdio.h>#include<string.h>int qx[70],qy[70],visx[70],visy[70],m,k,ans;char b[70];void dfs(int p,int count){ int i; if(count==k) { ans++; return; } for(i=p;i<m;i++) if(!visx[qx[... 阅读全文
posted @ 2011-08-23 23:35 Staginner 阅读(315) 评论(0) 推荐(0) 编辑
摘要: POJ_3278 这个是个比较简单的BFS的题目。#include<stdio.h>#include<string.h>int dis[200010],q[200010];int main(){ int i,j,N,K,front,rear,n,newn; while(scanf("%d%d",&N,&K)==2) { memset(dis,-1,sizeof(dis)); dis[N]=0; front=rear=0; q[rear++]=N; while(front<rear) { ... 阅读全文
posted @ 2011-08-23 02:44 Staginner 阅读(192) 评论(0) 推荐(0) 编辑
摘要: POJ_3009一开始没有考虑周全,导致做这个题目的时候很是坎坷。首先,石头在移动的过程中,是可能在同一位置出现两次的,因而用vis[][]进行判重是不可取的,同时也正是基于这一点,用dis[][]去记录最短距离也同样是不可取的。其次,由于这个题目一次碰撞会让Block消失,因而会影响下面的操作,所以一般的BFS是行不通的。考虑到上面两点之后,便放弃BFS,而改用DFS。这个题目如果不限定解的深度而直接DFS会超时,所以在DFS过程中要限定解的深度在10及10以内。如果这个题目解的深度更深的话,还可以考虑用叠代加深的方式去DFS。#include<stdio.h>#include& 阅读全文
posted @ 2011-08-23 01:57 Staginner 阅读(358) 评论(0) 推荐(0) 编辑
摘要: POJ_2251 这个题目相比之前做过的BFS遍历迷宫的问题,相当于增加了一维的空间,这样在移动的时候就多了两种选择。#include<stdio.h>#include<string.h>int a[35][35][35],dis[35][35][35],vis[35][35][35];int qx[27010],qy[27010],ql[27010];int dx[]={-1,1,0,0},dy[]={0,0,-1,1};char b[50];int main(){ int i,j,k,L,R,C,front,rear,sx,sy,sl,tx,ty,tl,l,x,y, 阅读全文
posted @ 2011-08-23 00:02 Staginner 阅读(187) 评论(0) 推荐(0) 编辑