magic squares java_Magic Squares

在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板。这是一张有8个大小相同的格子的魔板:

1 2 3 4

8 7 6 5

我们知道魔板的每一个方格都有一种颜色。这8种颜色用前8个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示。这是基本状态。

这里提供三种基本操作,分别用大写字母“A”,“B”,“C”来表示(可以通过这些操作改变魔板的状态):

“A”:交换上下两行;

“B”:将最右边的一列插入最左边;

“C”:魔板中央四格作顺时针旋转。

下面是对基本状态进行操作的示范:

A: 8 7 6 5

1 2 3 4

B: 4 1 2 3

5 8 7 6

C: 1 7 2 4

8 6 3 5

对于每种可能的状态,这三种基本操作都可以使用。

你要编程计算用最少的基本操作完成基本状态到目标状态的转换,输出基本操作序列。

解题思路:

用康托展开将魔板的状态(如2 6 8 4 5 7 3 1)映射到[0, 8! - 1] = [0, 40319]中,这种映射是一一对应的,作为本题的hash方法来节省空间。并且有将[0, 40319]中的数还原为魔板状态的方法。实现均不复杂,详见维基百科(http://zh.wikipedia.org/wiki/%E5%BA%B7%E6%89%98%E5%B1%95%E5%BC%80)

用Change(int hash_in, int method)模拟A, B, C三种操作。其中hash_in为输入的模板状态经过康托展开后的hash值,method = [0, 2]分别为A, B, C三种操作,而输出值为经过method操作之后魔板状态的hash值。

从初始状态的hash值开始BFS,用hash_table保存BFS的状态。其中hash_table[i][0]代表从初始状态变化到hash值为i的状态所经过的步骤数,hash_table[i][1]则代表状态i的父节点的状态值,hash_table[i][2]代表由i父节点变化到i所使用的操作([0, 2])

BFS结束后,计算输入的目标状态值的hash值goal_hash,从hash_table[goal_hash][0..2]回溯到初始状态值就能够获得从初始状态值到目标状态值的最短路径以及其长度。

代码:

/*

ID: zc.rene1

LANG: C

PROG: msquare

*/

#include

#include

#include

#define MAX 40320

int factorial[8];

int visited[9];

int hash_table[40320][3];

void GenerateFactorial(void)

{

int i;

factorial[0] = 1;

for (i=1; i<8; i++)

{

factorial[i] = i * factorial[i - 1];

}

}

int GetHash(int in[8])

{

int ret = 0;

int i, j, count;

memset(visited, 0, 9*sizeof(int));

for (i=0; i<8; i++)

{

count = 0;

for (j=1; j

{

if (visited[j] == 0)

{

count++;

}

}

visited[in[i]] = 1;

ret += count * factorial[7 - i];

}

return ret;

}

void ReverseHash(int hash_code, int ret[8])

{

int result, remainder, temp;

int i, j;

memset(visited, 0, 9*sizeof(int));

for (i=7; i>=0; i--)

{

remainder = hash_code % factorial[i];

hash_code /= factorial[i];

temp = hash_code + 1;

for (j=0; j<=temp; j++)

{

if (visited[j] == 1)

{

temp++;

}

}

ret[7 - i] = temp;

visited[temp] = 1;

hash_code = remainder;

}

}

int Change(int hash_in, int method)

{

int i, temp;

int in[8];

ReverseHash(hash_in, in);

if (method == 0)

{

for (i=0; i<4; i++)

{

temp = in[i];

in[i] = in[7-i];

in[7-i] = temp;

}

}

else if (method == 1)

{

temp = in[3];

for (i=3; i>0; i--)

{

in[i] = in[i-1];

}

in[0] = temp;

temp = in[4];

for (i=4; i<7; i++)

{

in[i] = in[i+1];

}

in[7] = temp;

}

else

{

temp = in[6];

in[6] = in[5];

in[5] = in[2];

in[2] = in[1];

in[1] = temp;

}

return GetHash(in);

}

void BFS(int hash_code, int level)

{

int i, j, k;

int method, hash_change;

int queue[40320];

memset(queue, -1, 40320*sizeof(int));

memset(hash_table, -1, 40320*3*sizeof(int));

i = 0;

j = 0;

k = 0;

queue[k++] = hash_code;

j++;

hash_table[hash_code][0] = level;

while (i != j)

{

level++;

for (i=0; i

{

hash_code = queue[i];

for (method=0; method<3; method++)

{

hash_change = Change(hash_code, method);

if (hash_table[hash_change][0] == -1)

{

queue[k++] = hash_change;

hash_table[hash_change][0] = level;

hash_table[hash_change][1] = hash_code;

hash_table[hash_change][2] = method;

}

}

}

j = k;

}

}

int main(void)

{

FILE *fin, *fout;

int i;

int goal[8];

int init[8] = {1, 2, 3, 4, 5, 6, 7, 8};

int goal_hash, len;

int *path = NULL;

fin = fopen("msquare.in", "r");

fout = fopen("msquare.out", "w");

for (i=0; i<8; i++)

{

fscanf(fin, "%d", &goal[i]);

}

GenerateFactorial();

BFS(GetHash(init), 0);

goal_hash = GetHash(goal);

len = hash_table[goal_hash][0];

path = (int *)malloc(len*sizeof(int));

for (i=0; i

{

path[len-1-i] = hash_table[goal_hash][2];

goal_hash = hash_table[goal_hash][1];

}

fprintf(fout, "%d\n", len);

for (i=0; i

{

fprintf(fout, "%c", path[i] + 'A');

}

fprintf(fout, "\n");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的海滨体育馆管理系统,源码+数据库+毕业论文+视频演示 本基于Spring Boot的海滨体育馆管理系统设计目标是实现海滨体育馆的信息化管理,提高管理效率,使得海滨体育馆管理工作规范化、高效化。 本文重点阐述了海滨体育馆管理系统的开发过程,以实际运用为开发背景,基于Spring Boot框架,运用了Java技术和MySQL作为系统数据库进行开发,充分保证系统的安全性和稳定性。本系统界面良好,操作简单方便,通过系统概述、系统分析、系统设计、数据库设计、系统测试这几个部分,详细的说明了系统的开发过程,最后并对整个开发过程进行了总结,实现了海滨体育馆相关信息管理的重要功能。 本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高海滨体育馆管理效率。 关键词:海滨体育馆管理,Java技术,MySQL数据库,Spring Boot框架 本基于Spring Boot的海滨体育馆管理系统主要实现了管理员功能模块和学生功能模块两大部分,这两大功能模块分别实现的功能如下: (1)管理员功能模块 管理员登录后可对系统进行全面管理操作,包括个人中心、学生管理、器材管理、器材借出管理、器材归还管理、器材分类管理、校队签到管理、进入登记管理、离开登记管理、活动预约管理、灯光保修管理、体育论坛以及系统管理。 (2)学生功能模块 学生在系统前台可查看系统信息,包括首页、器材、体育论坛以及体育资讯等,没有账号的学生可进行注册操作,注册登录后主要功能模块包括个人中心、器材管理、器材借出管理、器材归还管理、校队签到管理、进入登记管理、离开登记管理、活动预约管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值