虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > C/C++编程 > HDU 2234 无题I

HDU 2234 无题I
类别:C/C++编程   作者:码皇   来源:star_sky hht     点击:

无题ITime Limit : 10000 10000ms (Java Other) Memory Limit : 32768 32768K (Java Other)Total Submission(s) : 2 Accepted Submission(s) : 1Problem Description 一天机器人小A在玩一

 

无题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 #include #include #include #include #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,len);
    break;
    }
    }
    if(len>5) printf(-1);
    }
    }


 

 

相关热词搜索: HDU 2234 无题I