题解:纸牌只能移到比其大一的纸牌上,所以移动方向是定的,那么,就只有选择移动先后的问题了,对于决定要移的纸牌,比如1,如果2,3,4都是visited的状态,那么1一定是要移动到5的,因为2,3,4一定是全在5上了,清楚这一点,这道题就变得很简单的:
#include <cstdio> #include <iostream> using namespace std; int V[15],a[15],ans; void dfs(int now,int step){ if (now>=ans) return; if (step==9){ans=now;return;} for(int i=1;i<10;i++) if(!V[i]){ for(int j=i+1;j<=10;j++){ if(!V[j]){ V[i]=true; dfs(now+abs(a[i]-a[j]),step+1); break; } } V[i]=false; } } int main(){ int T,sit; scanf("%d",&T); while(T--){ ans=999999999; for(int i=1;i<=10;i++){ scanf("%d",&sit); a[sit]=i; } memset(V,false,sizeof(V)); dfs(0,0); printf("%d ",ans); } return 0; }