HDU 2234 无题I
来源:互联网 发布:下拉菜单获取数据库 编辑:程序博客网 时间:2024/05/29 16:21
无题I
Time Limit : 10000/10000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 2 Accepted Submission(s) : 1
Problem Description
一天机器人小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
21 2 3 41 2 3 41 2 3 42 3 4 14 1 1 11 2 2 22 3 3 33 4 4 4
Sample Output
11
Source
HDOJ 2008 Summer Exercise(2)- Hold by Captain Xu
每次改变四个点状态
预估四个都改变正确 则至少需要移动次数为 (ANS+3)/4;
#include <iostream>#include <cstdio>#include <queue>#include <cstring>#include <string>#define inf 1<<30using namespace std;int get_h(int b[4][4]){ int ans=inf,tmp=0; for(int i=0;i<4;i++){ bool flag[5]; int cnt=4; memset(flag,false,sizeof(flag)); for(int j=0;j<4;j++) if(!flag[b[i][j]]){ cnt--; flag[b[i][j]]=true; } tmp+=3-cnt; } ans=min(tmp,ans); tmp=0; for(int j=0;j<4;j++){ bool flag[5]; int cnt=4; memset(flag,false,sizeof(flag)); for(int i=0;i<4;i++) if(!flag[b[i][j]]){ cnt--; flag[b[i][j]]=true; } tmp+=3-cnt; } ans=min(tmp,ans); return (ans+3)/4;}bool dfs(int len,int a[4][4],int kind,int kind1){ if(get_h(a)>len) return false ; if(len==0) return true ; int aa[4][4]; for(int i=0; i<4; i++) { if(kind==i&&kind1==2) { ; } else { for(int j=0; j<4; j++) for(int k=0; k<4; k++) aa[j][k]=a[j][k]; for(int j=0; j<4; j++) if(j) aa[i][j]=a[i][j-1]; else aa[i][j]=a[i][3]; if(dfs(len-1,aa,i,1)) return true ; } if(kind==i&&kind1==1) ; else { for(int j=0; j<4; j++) for(int k=0; k<4; k++) aa[j][k]=a[j][k]; for(int j=0; j<4; j++) if(j!=3) aa[i][j]=a[i][j+1]; else aa[i][j]=a[i][0]; if(dfs(len-1,aa,i,2)) return true ; } if(kind==i&&kind1==3) { ; } else { for(int j=0; j<4; j++) for(int k=0; k<4; k++) aa[j][k]=a[j][k]; for(int j=0; j<4; j++) if(j!=3) aa[j][i]=a[j+1][i]; else aa[j][i]=a[0][i]; if(dfs(len-1,aa,i,4)) return true ; } if(kind==i&&kind1==4) { ; }else { for(int j=0; j<4; j++) for(int k=0; k<4; k++) aa[j][k]=a[j][k]; for(int j=0; j<4; j++) if(j) aa[j][i]=a[j-1][i]; else aa[j][i]=a[3][i]; if(dfs(len-1,aa,i,3)) return true ; } } return false ;}int main(){ int t; scanf("%d",&t); while(t--) { int a[4][4]; for(int i=0; i<4; i++) { for(int j=0; j<4; j++) scanf("%d",&a[i][j]); } int len; for(len=get_h(a); len<=5; len++) { if(dfs(len,a,-1,-1)) { printf("%d\n",len); break; } } if(len>5) printf("-1\n"); }}
0 0
- HDU 2234 无题I
- hdu 2234 无题I IDA*
- HDU 2234 无题I IDA*搜索
- HDU 2234 无题I (BFS,映射)
- 【搜索进阶】HDU 2234 无题I
- HDU ACM 2234 无题I->IDA*算法
- HDU-2234 无题I(IDA*)
- hdu 2234 无题I (IDA*+dfs)
- HDU2234 无题I (IDA*)
- HDU 4038 无题
- hdu 1871 无题
- hdu 2236 无题II
- 无题(hdu 1871)
- hdu 1871 无题
- 无题 hdu-1871
- hdu 1871 无题(排序)
- HDU 1871 无题 贪心
- HDU 1871 无题
- Zabbix 客户端自定义端口监控
- c语言实现,图形界面扫雷
- LeetCode题解——Flatten Binary Tree to Linked List
- QT 的信号与槽机制介绍
- Codeforces Round #325 (Div. 1) 解题报告
- HDU 2234 无题I
- 如何解决win7开机提示未能连接一个Windows服务
- C语言实现链表之单向链表(九)在任意位置插入结点
- Java Exception
- 快速排序
- 手机端实现Protocol Buffer
- scala + intellij idea 环境搭建及编译、打包
- Ackerman函数
- 开始奋斗的程序媛