拼图 4.14

原创 2018年04月15日 11:17:52

这个拼图游戏要求将一些图形拼成一个正方形,图形的个数从1到5。如下图所示,图形个数是4。


图形不能旋转,拼的时候不能重叠,拼完后的正方形里面不能有空隙。所有给定的图形都要使用。

左面的图表示这样拼不行,右面是一个成功的拼法。

现在,@潘帕斯雄鹰想知道他能否完成这个游戏以表示自己是最强的鹰;如果可以,请输出一种完成这个游戏的方案。

输入格式:

文件的第一行是一个整数n,表示图形的个数,范围从1到5。

接下来有n个部分,每个部分的第一行是2个整数i和j,表示下面的i行j列用来描述一个图形。图形用0和1表示,1表示图形占有这个位置,0表示不占有,中间没有空格。例如上图中图形A的描述是

2 3

111

101

所有图形的长与宽都不超过5。

根据图形给出的顺序给每个图形编号,从1开始,至多到5。

保证数据无多解情况。

输出文件:

如果不能拼成一个正方形,就输出“No solution possible”;否则,输出一种拼的方案:一个正方形的数阵,每个位置上的数字是占有这个位置的图形的编号,中间没有空格。例如上面A、B、C、D的编号依次是1、2、3、4,那么就可以输出

1112

1412

3422

3442

 

输入样例1:

4

1 4

1111

1 4

1111

1 4

1111

2 3

111

001

 

输出样例1:

No solution possible

 

输入样例2:

5

2 2

11

11

2 3

111

100

3 2

11

01

01

1 3

111

1 1

1

 

 

输出样例2:

1133

1153

2223

2444

爆搜回溯“好题”

#include<bits/stdc++.h>
#define V ((int)sqrt(res))
using namespace std;
int n,x[10],y[10],a[100][100],Map[100][100][10],res=0;
inline bool pd(int xx,int yy,int k){
	for(int i=1;i<=x[k];i++)
		for(int j=1;j<=y[k];j++)
			if(a[i+xx-1][j+yy-1]&&Map[i][j][k])
			return false;
	return true;
}inline void dfs(int k){
	if(k==n+1){
		for(int i=1;i<=V;i++){
			for(int j=1;j<=V;j++)
			printf("%d",a[i][j]);
			puts("");
		}
		exit(0);//搜到结果输出后直接跳掉
	}for(int i=1;i<=V;i++)
		for(int j=1;j<=V;j++)//枚举左上角
			if(pd(i,j,k)){//判断是否可以放上这个图形
				for(int l=1;l<=x[k];l++)
					for(int r=1;r<=y[k];r++)
				a[l+i-1][r+j-1]+=Map[l][r][k]*k;//放上该图形
				dfs(k+1);
				for(int l=1;l<=x[k];l++)
					for(int r=1;r<=y[k];r++)
				a[l+i-1][r+j-1]-=Map[l][r][k]*k;//回溯
			}
}int main(){char ch;
//freopen("puzzling.in","r",stdin);
//freopen("puzzling.out","w",stdout);
	scanf("%d",&n);for(int i=0;i<=200;i++)
		for(int j=0;j<=200;j++){
		a[i][j]=1;	//这里定了边界
	}for(int i=1;i<=n;i++){
		scanf("%d%d",&x[i],&y[i]);
		for(int j=1;j<=x[i];j++)for(int k=1;k<=y[i];k++){
			cin>>ch;Map[j][k][i]=ch^48;
			if(Map[j][k][i])res+=1;//Map[j][k][i]表示第i个图形(j,k)位置为1 
    	}
	}if(res==1){
		puts("1");exit(0);//这句特判是需要的,有可能会有许多0中间一个1的毒瘤数据
	}if(V*V!=res){
		puts("No solution possible");
		exit(0);
	}for(int i=1;i<=V;i++)
		for(int j=1;j<=V;j++){
			a[i][j]=0;
	}dfs(1);//从第一个图形开始搜索
	puts("No solution possible");
	return 0;
}

Scratch项目式学习--拼图游戏设计与开发

信息社会,编程就和传统的“读、写、算”一样,是一种必备的基本能力,而这种能力可以从儿童编程开始。本课程以“拼图游戏”为项目,按照软件开发的流程,从游戏的分析和设计入手,确定游戏的背景、角色和规则;然后从准备素材到功能模块编程到调试,体验完整的项目开发过程。学习者会不断地遇到问题,分析原因,训练工程思维,提升解决问题的能力。
  • 2017年05月05日 08:16

Sandboxie沙盘4.14 x64破解+注册教程【测试可用】

  • 2016年06月14日 03:53
  • 5.17MB
  • 下载

Linux 4.14 特性汇总

Linux内核追踪[4.14] X86的5级页表管理 持续更新中...... 参考: 更完整的版本:https://kernelnewbies.org/Linux_4.14 所有Linux历史...
  • lovelycheng
  • lovelycheng
  • 2017-11-15 22:21:33
  • 465

UE4 4.14 animation new features

  • 2016年12月10日 10:15
  • 9.24MB
  • 下载

沙盘4.14完美破解版

  • 2018年03月07日 16:28
  • 3.27MB
  • 下载

易语言4.14完美绿色破解版(含-易语言V4.14破解补丁)

  • 2009年12月06日 12:58
  • 13.08MB
  • 下载

易语言4.14完美破解版

  • 2010年01月29日 17:17
  • 9KB
  • 下载

Linux 4.13/4.14内核中带来的ULP(Upper Layer Protocol)

序过了一个很爽的国庆假期,跟小小的小男朋友家长一起回其老家尝到了潮汕美食,南澳岛捕鱼捕虾,海鲜撑到爆,回到深圳次日小小另一个小朋友家长又带我们到东莞长安尝到了正宗的恩施土家菜,几天下来喝了几顿爽酒,吃...
  • dog250
  • dog250
  • 2017-10-14 07:36:01
  • 7470

最新MDK4.14(Keil uVision4)破解版下载

  • 2011年03月01日 12:29
  • 193KB
  • 下载

javascript拼图算法

学了html5的拖拽事件,相信做出一款小小的拼图游戏也不难吧。就来说一下怎么用drag事件完成拼图游戏吧,当然html5的新方法在IE下是不兼容的。这里我把这个拼图游戏封装成一个小插件,感兴趣的话可以...
  • u014725878
  • u014725878
  • 2016-11-30 20:54:01
  • 680
收藏助手
不良信息举报
您举报文章:拼图 4.14
举报原因:
原因补充:

(最多只允许输入30个字)