搜索专题

1. 数字排列

小Y得到了一个数,他认为相邻位上的数字与数字之间会产生不良影响,比如123,1和2之间产生一个不良影响值,2和3之间产生一个不良影响值。现在他想调整这个数每位的数字的顺序,使得最终得到的数的总的不良影响值最小,且没有前导0。

对于每组数据输出一行一个数,表示最小的不良影响值。

 

算法:枚举每一种可能,刚开始想用BFS写,记录前面节点已经走过哪些节点挺麻烦,要在node结构体内开个数组,估计会MLE~~就没写了~~

          其实用DFS,非常方便,一个简单的剪枝就可以了~~

 代码:

View Code
#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;
}

 

posted on 2013-04-12 09:26  luckyboy1991  阅读(148)  评论(0编辑  收藏  举报