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
原创粉丝点击