比赛 20100927 评测结果 AAAAAAAATT
题目名称 魔术数字游戏 最终得分 80
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-09-27 22:33:00
显示代码纯文本
#include <cstdio>
using namespace std;

int I,J;
int map[4][4];
bool used[17];
bool out=false;

inline bool check(int a,int b)
{
	if (a==0) return true;
	else if (a==1&&b==0)
	{
		if (map[0][0]+map[0][1]+map[0][2]+map[0][3]!=34)
			return false;
	}
	if (a==1&&b==2)
	{
		if (map[0][0]+map[0][1]+map[1][0]+map[1][1]!=34)
			return false;
	}
	else if (a==2&&b==0)
	{
		if (map[0][2]+map[0][3]+map[1][2]+map[1][3]!=34)
			return false;
		if (map[1][0]+map[1][1]+map[1][2]+map[1][3]!=34)
			return false;
	}
	else if (a==2&&b==3)
	{
		if (map[1][1]+map[1][2]+map[2][1]+map[2][2]!=34)
			return false;
	}
	else if (a==3&&b==0)
	{
		if (map[2][0]+map[2][1]+map[2][2]+map[2][3]!=34)
			return false;
		if (map[2][2]+map[2][3]+map[3][2]+map[3][3]>34)
			return false;
		if (map[3][0]+map[3][1]+map[3][2]+map[3][3]>34)
			return false;
		for(int i=0;i<4;i++)
			if (map[0][i]+map[1][i]+map[2][i]+map[3][i]>34)
				return false;
		if (map[0][0]+map[1][1]+map[2][2]+map[3][3]>34)
			return false;
		if (map[0][3]+map[1][2]+map[2][1]+map[3][0]>34)
			return false;
		if (map[0][0]+map[0][3]+map[3][0]+map[3][3]>34)
			return false;
	}
	else if (a==4)
	{
		if (map[2][2]+map[2][3]+map[3][2]+map[3][3]!=34)
			return false;
		if (map[3][0]+map[3][1]+map[3][2]+map[3][3]!=34)
			return false;
		for(int i=0;i<4;i++)
			if (map[0][i]+map[1][i]+map[2][i]+map[3][i]!=34)
				return false;
		if (map[0][0]+map[1][1]+map[2][2]+map[3][3]!=34)
			return false;
		if (map[0][3]+map[1][2]+map[2][1]+map[3][0]!=34)
			return false;
		if (map[0][0]+map[0][3]+map[3][0]+map[3][3]!=34)
			return false;
	}
	return true;
}

void search(int a,int b)
{
	if (!check(a,b)) 
		return ;
	if (a==4)
	{
		if (out)
			printf("\n");
		else 
			out=true;
		for(int i=0;i<4;i++)
		{
			printf("%d",map[i][0]);
			for(int j=1;j<4;j++)
				printf(" %d",map[i][j]);
			printf("\n");
		}
		return ;
	}
	if (a+1==I&&b+1==J)
			search(a+(b+1)/4,(b+1)%4);
	else 
	for(int i=2;i<=16;i++)	
		if (!used[i])
		{
			map[a][b]=i;
			used[i]=true;
			search(a+(b+1)/4,(b+1)%4);
			used[i]=false;
			map[a][b]=0;
		}
}

int main()
{
	freopen("magic.in","r",stdin);
	freopen("magic.out","w",stdout);
	scanf("%d%d",&I,&J);
	map[I-1][J-1]=1;
	used[1]=true;
	search(0,0);
	return 0;
}