1584-蜘蛛牌

浮躁、、、又開始浮躁了、、、、

昨天一天明顯坐不住,雖然一直在想題,也一直在跑題【自我檢討】。

沉下心,在努力一把,加油!!!

昨天晚上聽了聽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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章