正文

拼图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 3
111
101
所有图形的长与宽都不超过5。
根据图形给出的顺序给每个图形编号,从1开始,至多到5。
保证数据无多解情况。
输出格式 Output Format
  如果不能拼成一个正方形,就输出"No solution possible";否则,输出一种拼的方案:一个正方形的数阵,每个位置上的数字是占有这个位置的图形的编号,中间没有空格。例如上面A、B、C、D的编号依次是1、2、3、4,那么就可以输出
1112
1412
3422
3442

///// 没什么好方法,穷举过了

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 10
int 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;
}

阅读(3003) | 评论(0)


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

评论

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