无题I

Time Limit: 10000ms
Memory Limit: 32768KB

This problem will be judged on HDU. Original ID: 2234
64-bit integer IO format: %I64d      Java class name: Main

 
一天机器人小A在玩一个简单的智力游戏,这个游戏是这样的,在一个4*4的矩阵中分别有4个1,4个2,4个3和4个4分别表示4种不同的东西,每一步小A可以把同一行的4个数往左移或者往右移一步或者把同一列的4个数字往上移或者往下移一步(1,2,3,4往左移后是2,3,4,1),小A现在想知道进过最少的几步移动可以将矩阵的每行上的4个数字都一样或者每列上的4个数字都一样。但是小A又不想走太多步,他只要知道最少步数是否少于等于5步,是的话输出准确的步数,否则输出-1。

 

Input

先输入一个整数T,表示有T组数据。
对于每组数据输入4行,每行4列表示这个矩阵。

 

Output

对于每组输入输出一个正整数表示最少的移动步数,大于5则输出-1.

 

Sample Input

  1. 2
  2.  
  3. 1 2 3 4
  4. 1 2 3 4
  5. 1 2 3 4
  6. 2 3 4 1
  7.  
  8. 4 1 1 1
  9. 1 2 2 2
  10. 2 3 3 3
  11. 3 4 4 4

Sample Output

  1. 1
  2. 1

Source

 
 
 
解题:IDA*
 
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <climits>
  7. #include <vector>
  8. #include <queue>
  9. #include <cstdlib>
  10. #include <string>
  11. #include <set>
  12. #define LL long long
  13. #define INF 0x3f3f3f3f
  14. using namespace std;
  15. int g[][],ans;
  16. bool check(int (*t)[]){
  17. int i,j;
  18. bool flag = false;
  19. for(i = ; i < ; i++){
  20. for(j = ; j < ; j++)
  21. if(t[j][i] != t[j-][i]) {flag = true;break;}//检查每一列
  22. if(flag) break;
  23. }
  24. if(!flag) return true;
  25. for(i = ; i < ; i++){
  26. for(j = ; j < ; j++)
  27. if(t[i][j] != t[i][j-]) {flag = false;break;}
  28. if(!flag) break;
  29. }
  30. return flag;
  31. }
  32. void shift(int (*t)[],int dir,int u){
  33. int i,temp;
  34. if(dir == ){//行左移
  35. temp = t[u][];
  36. for(i = ; i < ; i++)
  37. t[u][i] = t[u][i+];
  38. t[u][i] = temp;
  39. }else if(dir == ){//行右移
  40. temp = t[u][];
  41. for(i = ; i; i--)
  42. t[u][i] = t[u][i-];
  43. t[u][i] = temp;
  44. }else if(dir == ){//列上移
  45. temp = t[][u];
  46. for(i = ; i < ; i++)
  47. t[i][u] = t[i+][u];
  48. t[i][u] = temp;
  49. }else if(dir == ){//列下移
  50. temp = t[][u];
  51. for(i = ; i; i--)
  52. t[i][u] = t[i-][u];
  53. t[i][u] = temp;
  54. }
  55. }
  56.  
  57. bool dfs(int (*t)[],int step){
  58. int mp[][],i,j,k;
  59. if(ans == step && check(t)) return true;
  60. if(ans <= step) return false;
  61. for(i = ; i < ; i++){
  62. for(j = ; j < ; j++){
  63. memcpy(mp,t,sizeof(mp));
  64. shift(mp,j,i);
  65. if(dfs(mp,step+)) return true;
  66. }
  67. }
  68. return false;
  69. }
  70. int main(){
  71. int ks,i,j;
  72. scanf("%d",&ks);
  73. while(ks--){
  74. for(i = ; i < ; i++){
  75. for(j = ; j < ; j++)
  76. scanf("%d",g[i]+j);
  77. }
  78. if(check(g)) {puts("");continue;}
  79. for(ans = ; ans < ; ans++)
  80. if(dfs(g,)) break;
  81. printf("%d\n",ans<?ans:-);
  82. }
  83. return ;
  84. }

优化了下,效果不明显啊!

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <climits>
  7. #include <vector>
  8. #include <queue>
  9. #include <cstdlib>
  10. #include <string>
  11. #include <set>
  12. #define LL long long
  13. #define INF 0x3f3f3f3f
  14. using namespace std;
  15. int g[][],ans;
  16. bool check(int (*t)[]){
  17. int i,j;
  18. bool flag = false;
  19. for(i = ; i < ; i++){
  20. for(j = ; j < ; j++)
  21. if(t[j][i] != t[j-][i]) {flag = true;break;}//检查每一列
  22. if(flag) break;
  23. }
  24. if(!flag) return true;
  25. for(i = ; i < ; i++){
  26. for(j = ; j < ; j++)
  27. if(t[i][j] != t[i][j-]) {flag = false;break;}
  28. if(!flag) break;
  29. }
  30. return flag;
  31. }
  32. void shift(int (*t)[],int dir,int u){
  33. int i,temp;
  34. if(dir == ){//行左移
  35. temp = t[u][];
  36. for(i = ; i < ; i++)
  37. t[u][i] = t[u][i+];
  38. t[u][i] = temp;
  39. }else if(dir == ){//行右移
  40. temp = t[u][];
  41. for(i = ; i; i--)
  42. t[u][i] = t[u][i-];
  43. t[u][i] = temp;
  44. }else if(dir == ){//列上移
  45. temp = t[][u];
  46. for(i = ; i < ; i++)
  47. t[i][u] = t[i+][u];
  48. t[i][u] = temp;
  49. }else if(dir == ){//列下移
  50. temp = t[][u];
  51. for(i = ; i; i--)
  52. t[i][u] = t[i-][u];
  53. t[i][u] = temp;
  54. }
  55. }
  56.  
  57. bool dfs(int (*t)[],int step,int pre,int dir){
  58. int mp[][],i,j,k;
  59. if(ans == step && check(t)) return true;
  60. if(ans <= step) return false;
  61. for(i = ; i < ; i++){
  62. for(j = ; j < ; j++){
  63. memcpy(mp,t,sizeof(mp));
  64. if(i == pre && j == dir) continue;
  65. shift(mp,j,i);
  66. if(dfs(mp,step+,i,-j)) return true;
  67. }
  68. }
  69. return false;
  70. }
  71. int main(){
  72. int ks,i,j;
  73. scanf("%d",&ks);
  74. while(ks--){
  75. for(i = ; i < ; i++){
  76. for(j = ; j < ; j++)
  77. scanf("%d",g[i]+j);
  78. }
  79. if(check(g)) {puts("");continue;}
  80. for(ans = ; ans < ; ans++)
  81. if(dfs(g,,-,-)) break;
  82. printf("%d\n",ans<?ans:-);
  83. }
  84. return ;
  85. }

BNUOJ 6378 无题I的更多相关文章

  1. BNUOJ 52325 Increasing or Decreasing 数位dp

    传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...

  2. bnuoj 24251 Counting Pair

    一道简单的规律题,画出二维表将数字分别相加可以发现很明显的对称性 题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=24251 #include< ...

  3. bnuoj 44359 快来买肉松饼

    http://www.bnuoj.com/contest/problem_show.php?pid=44359 快来买肉松饼 Time Limit: 5000 ms     Case Time Lim ...

  4. BNUOJ 1006 Primary Arithmetic

    Primary Arithmetic 来源:BNUOJ 1006http://www.bnuoj.com/v3/problem_show.php?pid=1006 当你在小学学习算数的时候,老师会教你 ...

  5. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  6. bnuoj 25659 A Famous City (单调栈)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=25659 #include <iostream> #include <stdio.h ...

  7. bnuoj 25662 A Famous Grid (构图+BFS)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=25662 #include <iostream> #include <stdio.h ...

  8. bnuoj 4207 台风(模拟题)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4207 [题意]:中文题,略 [题解]:模拟 [code]: #include <iostrea ...

  9. bnuoj 4208 Bubble sort

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4208 [题意]:如题,求冒泡排序遍历趟数 [题解]:这题开始2B了,先模拟TLE,然后想了一下,能不 ...

随机推荐

  1. 记一次有关spark动态资源分配和消息总线的爬坑经历

    问题: 线上的spark thriftserver运行一段时间以后,ui的executor页面上显示大量的active task,但是从job页面看,并没有任务在跑.此外,由于在yarn mode下, ...

  2. Tomcat+Jenkins+SonarQube+SVN+Maven 集成自动化环境搭建(Windows10环境下)

    说在前面的话: 从接到任务到完成共用了7天的时间.正常人用不到这个时间. 此时的功能表现是: 登录本地JenKins对项目进行构建,能够自动从SVN读取最新代码并按照Maven项目构建,构建完成能够自 ...

  3. [ AHOI 2013 ] 作业 & [ BZOJ 3809 ] Gty的二逼妹子序列

    \(\\\) Description 给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问: 对于一个区间 \([L_i,R_i]\),问区间内有多少个数在 \([a_i,b_i]\ ...

  4. BigDecimal取余运算

    取余运算在编程中运用非常广泛,对于BigDecimal对象取余运算可以通过divideAndRemainder方法实现. public BigDecimal[] divideAndRemainder( ...

  5. IntelliJ IDEA openfire 使用IntelliJ IDEA 部署OPENFIRE 服务端

    用MyEclipse部署OF的步骤,网上有很多,可以自行google,这里要记录的是用据说最好用的JAVA编辑器IntelliJ IDEA来部署OF服务端.试了好多下,终于成功了,记录下. 直接上图吧 ...

  6. 四次元新浪微博客户端Android源码

    四次元新浪微博客户端Android源码 源码下载:http://code.662p.com/list/11_1.html [/td][td] [/td][td] [/td][td] 详细说明:http ...

  7. SQLite -附加数据库

    SQLite -附加数据库 考虑情况下当你有多个数据库可用,您希望使用其中任何一个.SQLite附加DTABASE语句用于选择一个特定的数据库,这个命令之后,所有SQLite语句将执行以下附加数据库. ...

  8. HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. emmm 深入浅出教你看懂现代金融游戏

    3303只信仰公平[网易陕西省西安网友]1 比特币是骗人的.你们都被“现代帼家纸币”概念茜脑了,而且茜的很彻底,所以你们看不透比特币的骗局.简单来说,现代纸币是“空气纸”,比特币是“空气币(空气数据) ...

  10. Spring_对缓存的支持

    使用SpringBoot开启缓存分为两步: 开启基于注解的缓存 标注缓存注解即可 如上就是一个简单的缓存示例 默认使用的是ConcurrentHashMap组件用来缓存的 package ustc.a ...