原题

有1234四个数字,每个数字八个。有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数。


对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了。

//不知道为什么都是IDDFS,我的跑的这么慢……

#include<cstdio>
#include<vector>
using namespace std;
int a[30],in[10]={0,7,8,9,12,13,16,17,18},ans,cnt;
int chg[5][8]={{0},{0,1,3,7,12,16,21,23},{0,2,4,9,13,18,22,24},{0,11,10,9,8,7,6,5},{0,20,19,18,17,16,15,14}};
vector <char> v;
char as[10]=" ABCDFEHG"; int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
} int stp()
{
int qwq=0,b[5]={0,0,0,0,0};
for (int i=1;i<=8;i++) b[a[in[i]]]++;
for (int i=1;i<=4;i++) qwq=max(qwq,b[i]);
return 8-qwq;
} bool chk()
{
for (int i=1;i<8;i++)
if (a[in[i]]!=a[in[i+1]]) return 0;
return 1;
} void change(int x)
{
int tmp=a[chg[x][1]];
for (int i=1;i<7;i++)
a[chg[x][i]]=a[chg[x][i+1]];
a[chg[x][7]]=tmp;
} void rechange(int x)
{
int tmp=a[chg[x][7]];
for (int i=7;i>1;i--)
a[chg[x][i]]=a[chg[x][i-1]];
a[chg[x][1]]=tmp;
} void dfs(int x)
{
if (ans) return ;
if (!x)
{
if (chk()) ans=1;
return ;
}
for (int i=1;i<=4;i++)
{
change(i);
if (stp()<=x) dfs(x-1);
if (ans)
{
v.push_back(as[i]);
return ;
}
rechange(i);
}
for (int i=2;i>=1;i--)
{
rechange(i);
if (stp()<=x) dfs(x-1);
if (ans)
{
v.push_back(as[i+4]);
return ;
}
change(i);
}
for (int i=4;i>2;i--)
{
rechange(i);
if (stp()<=x) dfs(x-1);
if (ans)
{
v.push_back(as[i+4]);
return ;
}
change(i);
}
} int main()
{
while (1)
{
cnt=0;
ans=0;
v.clear();
a[1]=read();
if (!a[1]) break;
for (int i=2;i<=24;i++)
a[i]=read();
if (chk())
{
printf("No moves needed\n%d\n",a[18]);
continue;
}
while (!ans) dfs(++cnt);
for (int i=v.size()-1;i>=0;i--) putchar(v[i]);
printf("\n%d\n",a[18]);
}
return 0;
}

最新文章

  1. 20145308刘昊阳 《Java程序设计》实验五报告
  2. DataTable使用技巧总结【转】
  3. BZOJ 2818
  4. codeforces 467C.George and Job 解题报告
  5. MHA监控进程异常退出
  6. Java Persistence API(转)
  7. 最大流问题Ford-Fulkerson方法(转)
  8. 创建并发布npm包
  9. 关于 asp.net 点击确定按钮 获取不到新值问题
  10. Spring AOP分析(2) -- JdkDynamicAopProxy实现AOP
  11. java.text.DateFormat 多线程并发问题
  12. GDAL create kml
  13. 日志管理工具之logrotate
  14. P1313 计算系数 HMR大佬讲解
  15. 正则-关于一个结果不确定现象怪的研究(reg.test(‘-1’))
  16. 如何加入Microsoft Teams 技术社区
  17. iOS分类底层实现原理小记
  18. 17mysql2█▓
  19. .CBB 文件 如何打开
  20. [ 原创 ] Java基础3--Java中的接口

热门文章

  1. 关于Vue 兄弟组件通信
  2. 写一个addEventListener以及removeEventListener
  3. 泉五培训Day4
  4. 堆(heap)和栈(stack)几点认识
  5. SAP标准导出功能 - 删除默认选定格式
  6. python3 练习题100例 (十六)鸡尾酒疗法
  7. POJ:2976-Dropping tests(二分平均值)
  8. [CodeForces948B]Primal Sport(数论)
  9. 13 KNN背景分割器
  10. 2753: [SCOI2012]滑雪与时间胶囊