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;
}



你可能感兴趣的:(search)