hdu1584 深搜水题

来源:互联网 发布:iphone数据流量开关 编辑:程序博客网 时间:2024/06/13 11:55
牌移动的步数为牌所在位置差的绝对值   
这道题用到深搜    每次出差跑牌面为1-9的牌  如果没移动过则尝试移动  如果能移动   就深搜下去  注意回溯
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int mark[15],num[15],Min;int abs(int a){    return a>0?a:-a;}int dfs(int sum,int coun){    int i,j;    if(sum>Min) return 0;//这里是一个优化  好像没有就会超时吧    if(coun==9)    {        Min=sum;        return 0;    }        for(i=1;i<10;i++)//列举1-9张牌  应为第10 号牌一定不用移动    {        if(!mark[i])        {            for(j=i+1;j<=10;j++)//找到牌i能移到的牌             {                if(!mark[j])                {                    mark[i]=1;                    dfs(sum+abs(num[j]-num[i]),coun+1);                    break;                }            }            mark[i]=0;//回溯        }    }    return 0;}int main(){    int i,T,a;    scanf("%d",&T);    while(T--)    {        for(i=1;i<=10;i++)        {            scanf("%d",&a);            num[a]=i;//记录每张牌所在位置        }               memset(mark,0,sizeof(mark));        Min=9999999;        dfs(0,0);                printf("%d\n",Min);    }    return 0;}
} return 0;}
0 0
原创粉丝点击