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
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; }
相关文章推荐
- Linux运维-zabbix_agent最新版的yum安装
- centos6安装新宋体
- linux下SOCKET在connect时遇到Operation now in progress
- linux常用命令—— 备份压缩(十五)
- (转)Linux sort命令
- cvFilter2D() 卷积初步了解
- Linux下用gzip和unzip命令来压缩和解压文件的用法
- MQTT在Linux下的体验
- OpenWrt增加软件包方法
- Linux学习笔记:read-only参数
- 将maven项目打war包并部署到Tomcat上
- 在eclipse中的tomcat内存设置
- 当我们谈论监控时,我们在谈论什么?
- linux php安装
- 怎样在DropDownList控件中响应OnSelectedIndexChanged事件
- Linux服务器时间同步
- linux环境变量的设置
- 最佳Nginx日志分析工具Goaccess
- i.mx27 linux 环境搭建 ubuntu 10.04
- 小胖说事24-----property's synthesized getter follows Cocoa naming convention for returning 'owned' objec