poj1110-double vision-搜索
2012-11-28 23:30
316 查看
题目:http://poj.org/problem?id=1110
其实思路挺简单,不过题意确实不够明了,而且从网页上都看不出来题目中那几个数字--行间距太大了,粘下来放到文本里就能看出是01234
对每个symbol遍历各种可能的情况,从上到下,每行从左到右,看看某位置(或某两个位置)其他symbol是不是'o',如果存在其他symbol相应位置上是'o',就说明这个不是unique的,不符合要求,继续找,找不到就是impossible
这个代码有点罗嗦,抽空看看精简一下,有个题解似乎结构更好一点,在这里http://shaidaima.com/source/view/10279
ViewCode
其实思路挺简单,不过题意确实不够明了,而且从网页上都看不出来题目中那几个数字--行间距太大了,粘下来放到文本里就能看出是01234
对每个symbol遍历各种可能的情况,从上到下,每行从左到右,看看某位置(或某两个位置)其他symbol是不是'o',如果存在其他symbol相应位置上是'o',就说明这个不是unique的,不符合要求,继续找,找不到就是impossible
这个代码有点罗嗦,抽空看看精简一下,有个题解似乎结构更好一点,在这里
//doublevision搜索 #include<cstdio> chara[10][81]; intn,r,c;//n--numofsymbols,r/c--numofrows/colsineachgrid intupper_bound; boolsearch(intx){ intbegin=x*(c+1); intend=begin+c-1;//inclusive for(inti=0;i<r;i++){ for(intj=begin;j<=end;j++){ if(a[i][j]=='o'){ intfwd=j,bwd=j;//forward,backward //boolpass=false; while((bwd-=(c+1))>=0){ if(a[i][bwd]!='.'){ break; } } if(bwd>=0){//comefrombreak,notqualified continue; } while((fwd+=(c+1))<=upper_bound){ if(a[i][fwd]!='.'){ break; } } if(fwd<=upper_bound){//comefrombreak,notqualified ;//donothing,loopagain,findanotherone }else{ a[i][j]='#'; returntrue; } } } } //check2#... // for(inti=0;i<r;i++){ for(intj=begin;j<=end;j++){ if(a[i][j]!='o'){ continue; } for(ints=i;s<r;s++){ for(intt=(s==i?j+1:begin); t<=end;t++){ if(a[s][t]!='o'){ continue; } intfwd1=j,bwd1=j;//1--ithrow intfwd2=t,bwd2=t;//2--jthrow while((bwd1-=(c+1))>=0){ bwd2-=(c+1); if(a[i][bwd1]!='.'&&a[s][bwd2]!='.'){ //notqualified,becausenotunique.本来这里的判断写成=='o',这个不对,因为有些已经被改成#了 break; } } if(bwd1>=0){//frombreak continue; } while((fwd1+=(c+1))<=upper_bound){ fwd2+=c+1; if(a[i][fwd1]!='.'&&a[s][fwd2]!='.'){ break; } } if(fwd1<=upper_bound){//comefrombreak,notqualified ;//donothing,loopagain,findanotherone }else{ a[i][j]='#'; a[s][t]='#'; returntrue; } } } } } returnfalse; } intmain() { inti; intcnt=1; while(scanf("%d%d%d\n",&n,&r,&c)!=EOF&&n!=0){ printf("Test%d\n",cnt++); upper_bound=(c+1)*(n-1)+c-1;//lastelement for(i=0;i<r;i++){ fgets(a[i],81,stdin); } for(i=0;i<n;i++){ if(!search(i)){//checkwhethersymbolihasunique# printf("impossible\n"); break; } } if(i==n){ for(i=0;i<r;i++){ printf("%s",a[i]); } } } return0; } //下面这个把search函数2个while循环变为1个while循环和一个for循环,更好理解一点,效率低了一点点,代码少了13行,main没变
ViewCode
//doublevision搜索 #include<cstdio> chara[10][81]; intn,r,c;//n--numofsymbols,r/c--numofrows/colsineachgrid intupper_bound; boolsearch(intx){ intbegin=x*(c+1); intend=begin+c-1;//inclusive for(inti=0;i<r;i++){ for(intj=begin;j<=end;j++){ if(a[i][j]=='o'){ intk=j;//forward,backward while(k>=c+1){ k-=(c+1); } for(;k<=upper_bound;k+=c+1){ if(a[i][k]!='.'&&k!=j){ break; } } if(k<=upper_bound){//findanother continue; }else{ a[i][j]='#'; returntrue; } } } } //check2#... // for(inti=0;i<r;i++){ for(intj=begin;j<=end;j++){ if(a[i][j]!='o'){ continue; } for(ints=i;s<r;s++){ for(intt=(s==i?j+1:begin); t<=end;t++){ if(a[s][t]!='o'){ continue; } intk1=j,k2=t;//forward,backward while(k1>=c+1){ k1-=(c+1); k2-=(c+1); } for(;k1<=upper_bound; k1+=c+1,k2+=c+1){ if(a[i][k1]!='.'&&a[s][k2]!='.' &&k1!=j){ break; } } if(k1<=upper_bound){//findanother continue; }else{ a[i][j]='#'; a[s][t]='#'; returntrue; } } } } } returnfalse; } intmain() { inti; intcnt=1; while(scanf("%d%d%d\n",&n,&r,&c)!=EOF&&n!=0){ printf("Test%d\n",cnt++); upper_bound=(c+1)*(n-1)+c-1;//lastelement for(i=0;i<r;i++){ fgets(a[i],81,stdin); } for(i=0;i<n;i++){ if(!search(i)){//checkwhethersymbolihasunique# printf("impossible\n"); break; } } if(i==n){ for(i=0;i<r;i++){ printf("%s",a[i]); } } } return0; }
//doublevision搜索 #include<cstdio> chara[10][81]; intn,r,c;//n--numofsymbols,r/c--numofrows/colsineachgrid intupper_bound; boolsearch(intx){ intbegin=x*(c+1); intend=begin+c-1;//inclusive for(inti=0;i<r;i++){ for(intj=begin;j<=end;j++){ if(a[i][j]=='o'){ intk=j;//forward,backward while(k>=c+1){ k-=(c+1); } for(;k<=upper_bound;k+=c+1){ if(a[i][k]!='.'&&k!=j){ break; } } if(k<=upper_bound){//findanother continue; }else{ a[i][j]='#'; returntrue; } } } } //check2#... // for(inti=0;i<r;i++){ for(intj=begin;j<=end;j++){ if(a[i][j]!='o'){ continue; } for(ints=i;s<r;s++){ for(intt=(s==i?j+1:begin); t<=end;t++){ if(a[s][t]!='o'){ continue; } intk1=j,k2=t;//forward,backward while(k1>=c+1){ k1-=(c+1); k2-=(c+1); } for(;k1<=upper_bound; k1+=c+1,k2+=c+1){ if(a[i][k1]!='.'&&a[s][k2]!='.' &&k1!=j){ break; } } if(k1<=upper_bound){//findanother continue; }else{ a[i][j]='#'; a[s][t]='#'; returntrue; } } } } } returnfalse; } intmain() { inti; intcnt=1; while(scanf("%d%d%d\n",&n,&r,&c)!=EOF&&n!=0){ printf("Test%d\n",cnt++); upper_bound=(c+1)*(n-1)+c-1;//lastelement for(i=0;i<r;i++){ fgets(a[i],81,stdin); } for(i=0;i<n;i++){ if(!search(i)){//checkwhethersymbolihasunique# printf("impossible\n"); break; } } if(i==n){ for(i=0;i<r;i++){ printf("%s",a[i]); } } } return0; }
相关文章推荐
- POJ 1110 Double Vision 已被翻译
- POJ-2488 A Knight's Journey(需注意搜索顺序的深搜)
- Dearboy's Puzzle (poj 2308 搜索 dfs+bfs)
- 搜索练习13/poj/problem1426 Find The Multiple/bfs
- poj-1321(简单搜索)
- POJ 2286 搜索 (IDA*)
- poj 3984 迷宫问题 —— 典型搜索--DFS递归
- poj 1064 Cable master(二分搜索)
- 未完成~【POJ搜索】
- POJ 3323 搜索
- POJ_3420_Quad Tiling_搜索,矩阵快速幂,状态压缩,动态规划
- poj 3273 Monthly Expense (二分搜索,最小化最大值)
- POJ 1724 记忆话搜索dp
- poj 1020 Anniversary Cake (搜索)
- POJ 1129 四色问题 暴力搜索
- poj-1577 Falling Leaves(搜索二叉树)
- DP背包 或 搜索 poj 3628 Bookshelf 2
- poj1020 搜索
- POJ 3039 搜索??? (逼近)
- [POJ 1164] The Castle 位运算加搜索