hdu 2234 IDA*

8 篇文章 0 订阅

都是泪。

h_row()是求让行相等的最少步

h_col()是求让列相等的最少步

然后神奇的是:

if( h_col() + deep <= maxdeep || h_col() + deep <= maxdeep ){
 //************
	//*********
}

这样是不行的

int tempp = min( h_col(), h_row() );
if( tempp + deep <= maxdeep  ){
	//*******
	//******
}
而这个才是正确的。。。。次奥!

好吧,刚刚看了下,一点都不神奇,上面那个||右边应该是h_row()的,好吧手滑了,哎,都是泪哭

AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX 0x3f3f3f3f

int num[5][5];
int maxdeep;

bool check(){
    int flag = 1;
    for( int i = 1; i <= 4; i++ ){
        for( int j = 1; j < 4; j++ ){
            if( num[i][j] != num[i][j+1] ){
                flag = 0;
                break;
            }
        }
        if( flag == 0 ){
            break;
        }
    }
    if( flag ){
        return true;
    }
    flag = 1;
    for( int i = 1; i <= 4; i++ ){
        for( int j = 1; j < 4; j++ ){
            if( num[j][i] != num[j+1][i] ){
                flag = 0;
                break;
            }
        }
        if( flag == 0 ){
            break;
        }
    }
    if( flag ){
        return true;
    }else{
        return false;
    }
}

int h_row(){
    int ans = MAX, cnt[5];
    for( int i = 1; i <= 4; i++ ){
        memset( cnt, 0, sizeof( cnt ) );
        for( int j = 1; j <= 4; j++ ){
            cnt[num[i][j]]++;
        }
        int maxi = 0;
        for( int j = 1; j <= 4; j++ ){
            maxi = max( maxi, cnt[j] );
        }
        ans = min( ans, maxi );
    }
    return 4 - ans;
}

int h_col(){
    int ans = MAX, cnt[5];
    for( int i = 1; i <= 4; i++ ){
        memset( cnt, 0, sizeof( cnt ) );
        for( int j = 1; j <= 4; j++ ){
            cnt[num[j][i]]++;
        }
        int maxi = 0;
        for( int j = 1; j <= 4; j++ ){
            maxi = max( maxi, cnt[j] );
        }
        ans = min( ans, maxi );
    }
    return 4 - ans;
}

int row_left( int r ){
    int temp = num[r][1];
    for( int i = 1; i < 4; i++ ){
        num[r][i] = num[r][i+1];
    }
    num[r][4] = temp;
    return 0;
}

int row_right( int r ){
    int temp = num[r][4];
    for( int i = 4; i > 1; i-- ){
        num[r][i] = num[r][i-1];
    }
    num[r][1] = temp;
    return 0;
}

int col_up( int c ){
    int temp = num[1][c];
    for( int i = 1; i < 4; i++ ){
        num[i][c] = num[i+1][c];
    }
    num[4][c] = temp;
    return 0;
}

int col_down( int c ){
    int temp = num[4][c];
    for( int i = 4; i > 1; i-- ){
        num[i][c] = num[i-1][c];
    }
    num[1][c] = temp;
    return 0;
}

bool DFS( int deep ){
    if( deep == maxdeep ){
        return check();
    }
    int tempp = min( h_col(), h_row() );
    if( tempp + deep <= maxdeep  ){
        for( int i = 1; i <= 4; i++ ){
            col_up( i );
            if( DFS( deep + 1 ) ){
                return true;
            }
            col_down( i );
        }
        for( int i = 1; i <= 4; i++ ){
            col_down( i );
            if( DFS( deep + 1 ) ){
                return true;
            }
            col_up( i );
        }
        for( int i = 1; i <= 4; i++ ){
            row_left( i );
            if( DFS( deep + 1 ) ){
                return true;
            }
            row_right( i );
        }
        for( int i = 1; i <= 4; i++ ){
            row_right( i );
            if( DFS( deep + 1 ) ){
                return true;
            }
            row_left( i );
        }
    }
    return false;
}

int main(){
    int T;

    cin >> T;
    while( T-- ){
        for( int i = 1; i <= 4; i++ ){
            for( int j = 1; j <= 4; j++ ){
                cin >> num[i][j];
            }
        }
        for( maxdeep = 0; maxdeep <= 5; maxdeep++ ){

            if( DFS( 0 ) ){
                break;
            }
        }
        if( maxdeep > 5 ){
            cout << -1 << endl;
        }else{
            cout << maxdeep << endl;
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值