10795 - A Different Task

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=456&problem=1736&mosmsg=Submission+received+with+ID+12193837

题目大意:汉诺塔,输入n个盘子的初始位置和最终位置,求从初始状态到最终状态所需移动的步数!

题目分析:

考虑盘子的初始状态start和目标状态final,我们只需找到两种状态中位置不相同的编号最大的盘子k,因为编号大且位置相同,则根本不需要要移动。则移动移动盘子k到目标状态final时,其他小于k的k-1个盘子一定顺序堆叠在6-final-start柱子上(将三根柱子依次编号1,2,3);设此时状态为参考状态,则将初始状态移成目标状态等同于,将目标状态和初始状态分别移至参考状态的步数之和+1;因为汉诺塔的移动是可逆的。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 70
#define LL long long
int n;
int start[MAX],end[MAX];
LL f(int *p,int i,int final)
{
   if (i==0)
      return 0;
   if (p[i]==final)   
   {
      return f(p,i-1,final);
   }
   return f(p,i-1,6-p[i]-final)+(1LL<<(i-1));
}
int main()
{
    int cnt=1;
    while (scanf("%d",&n)!=EOF)
    {
          if (n==0)
             break;
          int i,j;
          for (i=1;i<=n;i++)
          {
              scanf("%d",&start[i]);
          }
          for (i=1;i<=n;i++)
          {
              scanf("%d",&end[i]);
          }
          LL ans=0;
          int k=n;
          while (k>=1&&start[k]==end[k])
          {
                k--;
          }          
          if (k>=1)
          {
             int other=6-end[k]-start[k];
             ans=f(start,k-1,other)+f(end,k-1,other)+1;        
          }      
          printf("Case %d: %lld\n",cnt++,ans);
    }
    return 0;    
}


"Cannot create children for a parent that is in a different thread."是一个错误信息,意思是无法在不同的线程中为一个父对象创建子对象。这个错误通常在使用Qt框架时出现,由于Qt的线程模型的限制导致的。 为了解决这个问题,有几种方法可以尝试: 1. 确保在同一个线程中创建并管理父对象和子对象。确保在创建子对象前,父对象和子对象都在同一个线程中。 2. 使用信号和槽来传递数据和执行操作,而不是直接创建子对象。通过信号和槽机制,可以在不同线程之间传递数据和执行操作,而不会出现这个错误。 3. 在创建线程类后,在父对象中完成信号和槽的绑定。在线程类的构造函数中添加代码`this->moveToThread(this);`,将当前线程的所有权转移到线程类中,然后在线程类的`run()`方法中添加代码`this->exec();`以循环监听消息事件,从而触发槽函数。这种方法是笔者的一种独特解决方案。 以上是解决"Cannot create children for a parent that is in a different thread."错误的一些常见方法。具体的解决方法取决于你的具体应用场景和代码实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决 QObject: Cannot create children for a parent that is in a different thread.](https://blog.csdn.net/qq_36393978/article/details/128338447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [QT中socket在线程中运行代码](https://download.csdn.net/download/ilovevista/6977343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值