搜索专题
1. 数字排列
小Y得到了一个数,他认为相邻位上的数字与数字之间会产生不良影响,比如123,1和2之间产生一个不良影响值,2和3之间产生一个不良影响值。现在他想调整这个数每位的数字的顺序,使得最终得到的数的总的不良影响值最小,且没有前导0。
对于每组数据输出一行一个数,表示最小的不良影响值。
算法:枚举每一种可能,刚开始想用BFS写,记录前面节点已经走过哪些节点挺麻烦,要在node结构体内开个数组,估计会MLE~~就没写了~~
其实用DFS,非常方便,一个简单的剪枝就可以了~~
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<algorithm> using namespace std; int n,bit,minx; int visit[15]; int mp[12][12]; int num[12]; void get(int n) { bit = 0; while( n ) { bit++; num[bit] = n % 10; n /= 10; } } void dfs(int x, int cnt, int cost) { if( cost >= minx ) return; //剪枝 if( cnt == bit ) { minx = min(minx,cost); return; } for(int i = 1; i <= bit; i++) { if( visit[i] ) continue; visit[i] = 1; if( x != -1 ) dfs(num[i], cnt + 1, cost + mp[x][num[i]]); else dfs(num[i], cnt + 1, 0); visit[i] = 0; } } int main( ) { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i = 0; i < 10; i++) for(int j = 0; j < 10; j++) scanf("%d",&mp[i][j]); minx = 0x7fffffff; get(n); memset(visit,0,sizeof(visit)); dfs(-1,0,0); printf("%d\n",minx); } return 0; }