• 【UVa】1343 The Rotation Game(IDA*)


    题目

    题目
     


    分析

    lrj代码。。。。
    还有is_final是保留字,害的我CE了好几发。
     


    代码

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int line[8][7]={
      { 0, 2, 6,11,15,20,22}, // A
      { 1, 3, 8,12,17,21,23}, // B
      {10, 9, 8, 7, 6, 5, 4}, // C
      {19,18,17,16,15,14,13}, // D
    };
    
    const int rev[8] = {5, 4, 7, 6, 1, 0, 3, 2}; // reverse lines of each line
    
    // center squares
    const int center[8] = {6, 7, 8, 11, 12, 15, 16, 17};
    
    int a[24];
    char ans[1000];
    
    bool is__final()
    {
    	for(int i=0;i<8;i++)
    		if(a[center[i]]!=a[center[0]]) return false;
    	return true;
    }
    
    int diff(int target)
    {
    	int ans=0;
    	for(int i=0;i<8;i++)
    		if(a[center[i]]!=target) ans++;
    	return ans;
    }
    
    inline int h()
    {
    	return min(min(diff(1),diff(2)),diff(3));
    }
    
    inline void move(int i)
    {
      int tmp = a[line[i][0]];
      for(int j = 0; j < 6; j++) a[line[i][j]] = a[line[i][j+1]];
      a[line[i][6]] = tmp;
    }
    
    bool dfs(int d,int maxd)
    {
    	if(is__final())
    	{
    		ans[d]='';
    		printf("%s
    ",ans);
    		return true;
    	}
    	if(d+h() > maxd) return false;
    	for(int i=0;i<8;i++)
    	{
    		ans[d]='A'+i;
    		move(i);
    		if(dfs(d+1,maxd)) return true;
    		move(rev[i]);
    	}
    	return false;
    }
    int main()
    {
    	for(int i=4;i<8;i++)
    	for(int j=0;j<7;j++) line[i][j]=line[rev[i]][6-j];
    	
    	while(scanf("%d",&a[0])==1 && a[0])
    	{
    		for(int i=1;i<24;i++) scanf("%d",&a[i]);
    		for(int i=0;i<24;i++) if(!a[i]) return 0;
    		if(is__final()) printf("No moves needed
    ");
    		else
    		{
    			for(int maxd=1; ; maxd++)
    				if(dfs(0,maxd)) break;
    		}
    		printf("%d
    ",a[6]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    [FJOI 2016] 神秘数
    [SHOI 2017] 寿司餐厅
    [HAOI 2012] Road
    [HAOI 2012] 容易题
    [TJOI 2018] XOR
    [NOI 2011] 阿狸的打字机
    [ZJOI 2010] 排列计数
    [TJOI2016 & HEOI2016] 字符串
    [HNOI 2011] 数学作业
    【NTT】loj#6261. 一个人的高三楼
  • 原文地址:https://www.cnblogs.com/noblex/p/8119320.html
Copyright © 2020-2023  润新知