您的位置:首页 > 运维架构

HDU1195Open the Lock(AC)

2016-01-26 11:24 393 查看
Open the Lock

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 5480 Accepted Submission(s): 2442

Problem Description

Now an emergent task for you is to open a password lock. The password is consisted of four digits. Each digit is numbered from 1 to 9.

Each time, you can add or minus 1 to any digit. When add 1 to '9', the digit will change to be '1' and when minus 1 to '1', the digit will change to be '9'. You can also exchange the digit with its neighbor. Each action will take one step.

Now your task is to use minimal steps to open the lock.

Note: The leftmost digit is not the neighbor of the rightmost digit.

Input

The input file begins with an integer T, indicating the number of test cases.

Each test case begins with a four digit N, indicating the initial state of the password lock. Then followed a line with anotther four dight M, indicating the password which can open the lock. There is one blank line after each test case.

Output

For each test case, print the minimal steps in one line.

Sample Input

2

1234

2144

1111

9999

Sample Output

2

4

<pre class="cpp" name="code">#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
char cinit[4];
int init[4];
int right[4];
char cright[4];
int ans = 0;
int cur = 0;
int front = 0;

#define MAXINT 1000000

int visit[11][11][11][11]; //0--原始数据,1--加,2--减,3--相邻交换这个visit刚开始写错int visit[5][4]没用上,看到网上是int visit[11][11][11][11],BFS还是要有个标记的吧

/*这个人的做法和我的做法像http://bbs.csdn.net/topics/340202380*/

//第一次提交WA,为什么1234->2144是2不是3呢,好吧,这道题还有相邻交换的说法。。
//第二次提交还是WA,继续查错
//第三次提交runtime超时,好吧,bfs也会超时,我也是醉了。。。。不过自己写的代码确实是比较麻烦就是了,不简练
//把代码简化了,用了数组,但是还是超时,哎哎哎哎,这道题不是很简单吗?。。。。
//20160126提交又变成WA,我也是醉了
//20160126BFS()交换那段代码写的有点问题,OK了HDUAC,453ms,时间不算快的

typedef struct node
{
int step;
int xxx[5];
}nodes;

nodes que[MAXINT];

void BFS()
{
int i = 0;
int j = 0;
int quex[5]   = { 0 };
int tmpx[5]   = { 0 };
int questep = 0;

que[cur].xxx[1]     = init[0];
que[cur].xxx[2]     = init[1];
que[cur].xxx[3]     = init[2];
que[cur].xxx[4]     = init[3];
que[cur++].step     = 0;

visit[init[0]][init[1]][init[2]][init[3]] = 1;

while (front<cur)
{
tmpx[1] = que[front].xxx[1];
tmpx[2] = que[front].xxx[2];
tmpx[3] = que[front].xxx[3];
tmpx[4] = que[front].xxx[4];
questep = que[front].step;
if ((tmpx[1] == right[0]) && (tmpx[2] == right[1]) && (tmpx[3] == right[2]) && (tmpx[4] == right[3]))
{
ans = questep;
return;
}
//指从i位开始+
for (i = 1; i <= 4; i++)
{

quex[1] = tmpx[1];
quex[2] = tmpx[2];
quex[3] = tmpx[3];
quex[4] = tmpx[4];
if (tmpx[i] == 9)
{
quex[i] = 1;
}
else
{
quex[i] = tmpx[i] + 1;
}

if (1 == visit[quex[1]][quex[2]][quex[3]][quex[4]]) continue;
que[cur].xxx[1] = quex[1];
que[cur].xxx[2] = quex[2];
que[cur].xxx[3] = quex[3];
que[cur].xxx[4] = quex[4];
que[cur++].step = questep + 1;
visit[quex[1]][quex[2]][quex[3]][quex[4]] = 1;
}

//指从i位开始-
for (i = 1; i <= 4; i++) //
{
quex[1] = tmpx[1];
quex[2] = tmpx[2];
quex[3] = tmpx[3];
quex[4] = tmpx[4];
if (tmpx[i] == 1)
{
quex[i] = 9;
}
else
{
quex[i] = tmpx[i] - 1;
}
if (1 == visit[quex[1]][quex[2]][quex[3]][quex[4]]) continue;
que[cur].xxx[1] = quex[1];
que[cur].xxx[2] = quex[2];
que[cur].xxx[3] = quex[3];
que[cur].xxx[4] = quex[4];
que[cur++].step = questep + 1;
visit[quex[1]][quex[2]][quex[3]][quex[4]] = 1;
}

//交换
for (i = 1; i <= 3; i++) //
{
quex[1] = tmpx[1];
quex[2] = tmpx[2];
quex[3] = tmpx[3];
quex[4] = tmpx[4];

quex[i]     = tmpx[i + 1];
quex[i + 1] = tmpx[i];
if (1 == visit[quex[1]][quex[2]][quex[3]][quex[4]]) continue;

que[cur].xxx[1] = quex[1];
que[cur].xxx[2] = quex[2];
que[cur].xxx[3] = quex[3];
que[cur].xxx[4] = quex[4];
que[cur++].step = questep + 1;
visit[quex[1]][quex[2]][quex[3]][quex[4]] = 1;
}

front++;
}
return;
}

void inits()
{
int i = 0;
int j = 0;
int k = 0;
int m = 0;
for (i = 0; i < MAXINT; i++)
{
que[i].step = 0;
for (j = 0; j < 5;j++)
{
que[i].xxx[j] = 0;
}
}

for (i = 0; i < 11; i++)
{
for (j = 0; j < 11; j++)
{
for (k = 0; k < 11; k++)
{
for (m = 0; m < 11; m++)
{
visit[i][j][k][m] = 0;
}
}
}
}

cur   = 0;
front = 0;
return;
}

int main()
{
int T = 0;
int i = 0;
int j = 0;
freopen("input.txt","r",stdin);
scanf("%d",&T);
for (i = 0; i < T;i++)
{
ans = 0;
inits();
scanf("%s%s", &cinit, &cright);
for (j = 0; j < 4;j++)
{
init[j]  = cinit[j] - '0';
right[j] = cright[j] - '0';
}

BFS();

printf("%d\n",ans);
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: