HDU 1584 蜘蛛牌 搜索 回溯

来源:互联网 发布:枚举 c语言 编辑:程序博客网 时间:2024/06/06 02:18

题目:  深度优先搜索,一张牌只能放在比它大1的牌上面,i 是当前牌,遍历从i+1到10 ,如果有未被标记的数字,就是放的位置。我一开始想的是i只能放在i+1上,仔细一想,在顺着i+1像10的遍历过程中,我们已经标记过的数字都放在了正确的位置。从1到9为起点遍历所有情况即可。


#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std; const int inf = 0x3f3f3f3f; int ans ; int pos[11]; bool vis[11]; void dfs( int cnt,int step ){if ( step>=ans ) return ; if ( cnt==9 ) {ans = step; return ; }for ( int i=1; i<10; i++ )  {if ( !vis[i] ) {for ( int j=i+1; j<=10; j++ ) {if ( vis[j]==0 ) {vis[i] = 1 ; dfs( cnt+1, step + abs( pos[i]-pos[j] ) ); break; }}vis[i] = false; }}}int main(){int t; int temp; cin>>t; while ( t-- ){ans = inf ; for ( int i=1; i<=10; i++ ) {scanf("%d",&temp);pos[temp] = i; }memset( vis,0,sizeof vis ); dfs( 0,0 ); cout<<ans<<endl; }return 0; }