您的位置:首页 > 其它

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

//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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: