HDU1584 蜘蛛牌 [DFS简单题]

这个题一开始难哭,想不通为什么,现在大概理一理,思路如下:

1.一共只有十张牌,所以只是随机排列,并求出其中的距离之和;因为1只能接2,2接3,以此类推;

2.EG:1 4 5 2 3 所以应该先从1--->2,距离 abs = 4 - 1  = 3 ;

3.而且因为需要扫描,所以令初始标记为0,当满足要求则变为1,扫一遍后,再重新置为0,开始搜符合要求的;

PS:一开始多有借鉴大大们的代码,毕竟小白上路,不过大大们确实炒鸡厉害,在下面附上传送门:

他归类很详细,并且针对性比较强;

传送门:http://blog.csdn.net/libin56842/article/details/9799601;


AC代码如下:

#include <bits/stdc++.h>
#define N 10010
int n;
int i ,x ,ans;
using namespace std ;
int visit[N],a[N];
int  abs(int x)
{
	if (x<0) return -x;
	else return x ;
}

void dfs(int cnt , int sum )//*cnt为当前已经记录的纸牌数,sum为距离和*// 
{
	int i , j ; 
	if(sum>=ans)	//*做判断,寻找满足条件*// 
	return ;
	if(cnt==9)
	{
		ans=sum;
		return ;
	}
	else 
	{
		for( i = 1 ; i <10;i++)
		{
			if(visit[i]==0)  //*i,j判断是否已经被记录过了。*// 
			{
				visit[i]=1;
				for( j = i +1 ; j<=10;j++)
				{
					if(visit[j]==0)
					{
						dfs(cnt+1,sum+abs(a[i]-a[j]));
						break;
					}
				}
				visit[i]=0; //*重新标记*// 
			}
		}
	}
}

int main()
{
	cin>>n;
	while(n--)
	{
		for(int i = 1 ; i <=10;i++)
		{
			cin>>x;  //*输入牌的面值*// 
			a[x]=i;	 //*记录当前牌的位置*// 
		}
		memset(visit,0,sizeof(visit));
		ans=1000000;
		dfs(0,0);
		printf("%d\n",ans);
	}
	return 0 ;
}

一切来之不易,珍惜,坚持。用时间换取能力~~~

你可能感兴趣的:(HDU1584 蜘蛛牌 [DFS简单题])