程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 11212 IDA*

UVA 11212 IDA*

編輯:C++入門知識

UVA 11212 IDA*


移動一塊連續的區間使得數列遞增。問最少次數。

直接IDA*暴搜,不過我沒有想到A*函數,所以就隨手寫了個連續遞增塊數作為估價函數,WA了,然後除以2,還是WA,除以3,WA,除以4.。。過了= =

#include
#include
#include
#include
#include
#include
using namespace std;
#define stop system("pause")
int n,a[20],lim;
void print(int *a){for(int i=1;i<=n;i++) printf("%d ",a[i]);puts("");}
int h(int *s)
{
    int cnt=0;
    for(int i=1;i=from-1&&to<=ed) return false;
    int next[20],tmp[20];
    for(int i=0;i<=n;i++) tmp[i]=s[i],next[i]=i+1;
    next[from-1]=ed+1;
    next[to]=from;
    next[ed]=to+1;
    for(int i=next[0],cnt=1;cnt<=n;i=next[i],cnt++)
    {
        s[cnt]=tmp[i];
    }
    return true;
}
bool over(int *a)
{
    for(int i=1;i<=n;i++) if(a[i]!=i) return false;
    return true;
}
bool dfs(int dep,int *s)
{
    if(over(s)) return true;
    if(dep>=lim) return false;
    if(dep+h(s)>=lim) return false;
    for(int from=1;from<=n;from++)
    {
        for(int ed=from;ed<=n;ed++)
        {
            for(int to=0;to<=n;to++)
            {
                int tmp[15];
                memcpy(tmp,s,sizeof(int)*(n+1));
                if(change(from,ed,to,tmp)==0) continue;
                if(dfs(dep+1,tmp)) return true;
            }
        }
    }
    return false;
}
int main()
{
    int ca=1;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(lim=h(a);!dfs(0,a);lim++) ;
        printf("Case %d: %d\n",ca++,lim);
    }
    return 0;
}
/*
9
9 8 7 6 5 4 3 2 1
*/

貌似正解應該是 dep*3+h()>lim*3

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved