代码拉取完成,页面将自动刷新
有9个时钟,排成一个3*3的矩阵。
|-------| |-------| |-------|
| | | | | | |
|---O | |---O | | O |
| | | | | |
|-------| |-------| |-------|
A B C
|-------| |-------| |-------|
| | | | | |
| O | | O | | O |
| | | | | | | | |
|-------| |-------| |-------|
D E F
|-------| |-------| |-------|
| | | | | |
| O | | O---| | O |
| | | | | | | |
|-------| |-------| |-------|
G H I
(图 1)
现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
输入9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。输出输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。
3 3 0
2 2 2
2 1 2
4 5 8 9
#include <cstdio>
#include <cstring>
#include <iostream>
int mode[9];
int minstepcount=36;
char minstep[36];
int initmode()
{
char *modestr[]={
"ABDE", "ABC", "BCEF",
"ADG", "BDEFH", "CFI",
"DEGH", "GHI", "EFHI"
};
for (int i=0; i<9; i++)
{
mode[i]=0;
for (char c='A'; c<='I'; c++)
{
mode[i] *= 10;
if (strchr(modestr[i], c))
mode[i] += 1;
}
}
return 0;
}
int data2code(int data[])
{
int result = 0;
for (int i=0; i<9; i++)
result = result * 10 + data[i];
return result;
}
int code2data(int data[], int code)
{
for (int i=8; i>=0; i--)
{
data[i] = code % 10;
code /= 10;
}
return 0;
}
int change(int start, int modenum, int loop)
{
int resultdata[9], modedata[9];
code2data(modedata, modenum);
code2data(resultdata, start);
for (int i=0; i<loop; i++)
{
for (int j=0; j<9; j++)
resultdata[j] = (resultdata[j]+modedata[j])%4;
}
return data2code(resultdata);
}
int dotry(int start, int step[], int n)
{
if (start==0)
{
int stepcount=0;
for (int i=0; i<n; i++)
{
stepcount +=step[i];
/*for (int j=0; j<step[i]; j++)
printf("%d ", i+1);
*/
}
if (stepcount<minstepcount)
{
minstepcount=stepcount;
minstep[0]='\0';
char tmp[2];
tmp[1]='\0';
for (int i=0; i<n; i++)
for (int j=0; j<step[i]; j++)
{
tmp[0]='0'+i+1;
strcat(minstep, tmp);
}
}
return 0;
}
if (n==9)
{
return -1;
}
for (int i=0; i<4; i++)
{
step[n]=i;
int result=change(start, mode[n], i);
dotry(result, step, n+1);
}
}
int main()
{
int start;
int data[9], step[9]={0};
initmode();
for (int i=0; i<9; i++)
scanf("%d", &data[i]);
start = data2code(data);
dotry(start, step, 0);
printf("%c", minstep[0]);
for (int i=1; i<strlen(minstep); i++)
printf(" %c", minstep[i]);
printf("\n");
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。