正文

拼图2007-08-08 20:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/28312.html

分享到:

背景 Background   潘帕斯草原最近流行起了一种拼图游戏,@潘帕斯雄鹰为了显示自己是最强的鹰,想尽办法要在这个游戏上赢过其他鹰…… 描述 Description   这个拼图游戏要求将一些图形拼成一个正方形,图形的个数从1到5。如下图所示,图形个数是4。图形不能旋转,拼的时候不能重叠,拼完后的正方形里面不能有空隙。所有给定的图形都要使用。左面的图表示这样拼不行,右面是一个成功的拼法。现在,@潘帕斯雄鹰想知道他能否完成这个游戏以表示自己是最强的鹰;如果可以,请输出一种完成这个游戏的方案。 输入格式 Input Format   文件的第一行是一个整数n,表示图形的个数,范围从1到5。接下来有n个部分,每个部分的第一行是2个整数i和j,表示下面的i行j列用来描述一个图形。图形用0和1表示,1表示图形占有这个位置,0表示不占有,中间没有空格。例如上图中图形A的描述是2 3111101所有图形的长与宽都不超过5。根据图形给出的顺序给每个图形编号,从1开始,至多到5。保证数据无多解情况。 输出格式 Output Format   如果不能拼成一个正方形,就输出"No solution possible";否则,输出一种拼的方案:一个正方形的数阵,每个位置上的数字是占有这个位置的图形的编号,中间没有空格。例如上面A、B、C、D的编号依次是1、2、3、4,那么就可以输出1112141234223442 ///// 没什么好方法,穷举过了 #include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define MAX 10int gm[10][10][10]={0},gmfig[10][2],gn;int gfig[MAX][MAX]={0}; int move(int k,int *x, int *y){ int xt,yt,xg,yg,i,j; for(xt=*x,yt=*y; xt<=gn || yt<=gn;){  if(xt>gn){   xt=1;   yt++;  }  for(i=1,yg=yt; yg<=gn && i<=gmfig[k][0]; i++,yg++){   for(j=1,xg=xt; xg<=gn && j<=gmfig[k][1]; j++,xg++){    if( gm[k][i][j] && gfig[yg][xg] )     goto next;   }   if(j<=gmfig[k][1])    goto next;  }  if(i<=gmfig[k][0])   goto next;  for(i=1,yg=yt; yg<=gn && i<=gmfig[k][0]; i++,yg++)   for(j=1,xg=xt; xg<=gn && j<=gmfig[k][1]; j++,xg++){    if(gm[k][i][j])     gfig[yg][xg]=gm[k][i][j];   }  *x = xt+1;  *y = yt;  return 1;next:   xt++; } return 0;}int get(){ int  k,save[MAX][MAX],x,y; for(k=1; k<=gmfig[0][0]; k++){  if(!gm[k][0][0])   break; } if(k>gmfig[0][0])  return 1; for(k=1; k<=gmfig[0][0]; k++){  if(gm[k][0][0])   continue;  memcpy(save,gfig,sizeof(int)*MAX*MAX);  gm[k][0][0]=1;  for(x=y=1; move(k,&x,&y);){   if(get())    return 1;   else    memcpy(gfig,save,sizeof(int)*MAX*MAX);  }  gm[k][0][0]=0; } return 0;}int main(){ int i,j,it,jt,k,n; char str[20]; scanf("%d",&gn); gmfig[0][0]=gn; for(n=0,k=1; k<=gn; k++){  scanf("%d %d",&i,&j);  gmfig[k][0]=i;  gmfig[k][1]=j;  for(it=1; it<=i; it++){   scanf("%s",str);   for(jt=0; jt<j; jt++)    if(str[jt]=='1'){     gm[k][it][jt+1]=k;     n++;    }  } } gn=(int)sqrt(n); if(gn*gn != n)  printf("No solution possible\n"); else if(gn==1)  printf("1"); else{  if(get())   for(it=1; it<=gn; it++){    for(jt=1; jt<=gn; jt++)     printf("%d",gfig[it][jt]);    printf("\n");   }   else    printf("No solution possible\n"); } return 0;}

阅读(3120) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册