这个题一开始难哭,想不通为什么,现在大概理一理,思路如下:
1.一共只有十张牌,所以只是随机排列,并求出其中的距离之和;因为1只能接2,2接3,以此类推;
2.EG:1 4 5 2 3 所以应该先从1--->2,距离 abs = 4 - 1 = 3 ;
3.而且因为需要扫描,所以令初始标记为0,当满足要求则变为1,扫一遍后,再重新置为0,开始搜符合要求的;
PS:一开始多有借鉴大大们的代码,毕竟小白上路,不过大大们确实炒鸡厉害,在下面附上传送门:
他归类很详细,并且针对性比较强;
传送门:;
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("%dn",ans);}return 0 ;
}
一切来之不易,珍惜,坚持。用时间换取能力~~~
本文发布于:2024-01-31 19:57:27,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170670224830989.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |