浮躁、、、又開始浮躁了、、、、
昨天一天明顯坐不住,雖然一直在想題,也一直在跑題【自我檢討】。
沉下心,在努力一把,加油!!!
昨天晚上聽了聽ZYC的報告,深覺自己好不努力。感觸:羅列知識清單,把基礎知識全羅列出來,各個擊破。還有,長處有一個就足夠了,好好發揚。
另,昨天整理資料的時候發現,解題報告寫得非常爛,這方面的能力要加強。言歸正傳,
題意:
單色蜘蛛紙牌的玩法,只有1-10張牌。求最小移動距離。
分析:
開始的時候走了一個誤區(迄今沒有走出來),倒序搜索:最終一定是10 9 。。。。,所以,10是固定的,9只有一種移法9->10(也許9代表一個序列),搜索完9就搜索(9-1)即8,而8有8->9,8->10(前提是9已經在10下了,這個前面一步已經保證了)兩種移法,對於7,如果8沒有8->9這個移動,那麼不能有7->9這個移法。也就是隻有前面的數字到達過的數字,當前搜索的數字才能到達。
想法 應該是對的,但是代碼寫不出來。
正解:
一共10張牌,需要9步,枚舉所有情況就ok了。
代碼:
#include<iostream>
#include<queue>
using namespace std;
int N[11];
bool flag[11];
int Max;
void search(int n,int tot)//移動的步數,移動的距離
{
int i,j;
if(tot>=Max) return ;
if(n==9) {Max=tot;return ;}
for(i=1;i<10;i++)//一共9步
{
if(flag[i]==0)//沒搜過(還未移動的)
{
flag[i]=1;
for(j=i+1;j<11;j++)//10-i中到達方案
{
if(flag[j]==0)//沒到達
{
search(n+1,tot+abs(N[j]-N[i]));//把i移動到j下,然後,移動下一步
break;
}
}
flag[i]=0;
}
}
}
int main()
{
int n;
cin>>n;
while(n--)
{
Max=100000;
int i,a;
for(i=1;i<=10;i++)
{
flag[i]=0;
cin>>a;
N[a]=i;
}
search(0,0);
cout<<Max<<endl;
}
return 0;
}