| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1159 人关注过本帖
标题:回溯法解决虫蚀问题
只看楼主 加入收藏
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
 问题点数:0 回复次数:2 
回溯法解决虫蚀问题
我输出absum,知道不对了,有六位,还有七位的,应该是五位啊 ,帮忙看下,谢了
我输出absum,知道不对了,有六位,还有七位的,应该是五位啊 ,帮忙看下,谢了
[code=c]
/*ABCED+BDACE=EBBAA
key:10342
*/
#include <iostream.h>
int i=0;
const int n=5;
int a[n]={0,1,2,4,3};//ABCED 在x中的下标
int b[n]={1,3,0,2,4};//BDACE 在x中的下标
int absum[n]={0};
int c[n]={4,1,1,0,0};//EBBAA 在x中的下标
int x[n]={0,1,2,3,4};
void Swap(int &a,int &b)
{
 int temp=a;
 a=b;
 b=temp;
}
void Disp()
{
 for(int j=n-1;j>0;j--)
 {
  absum[j]+=(x[a[j]]+x[b[j]]);
  absum[j-1]+=(absum[j]/5);//进位
  absum[j]=absum[j]%5;
 }
 absum[0]+=(x[a[0]]+x[b[0]]);
 for(int k=0;k<n;k++)
   cout<<absum[k];//应该是五位,怎么还输出六位,七位的啊
 cout<<endl;
 int flag=1;
 for(j=0;j<n;j++)
 {
  if(absum[j]!=x[c[j]])//得到结果
   flag=0;
 }
 if(flag)
 {
  cout<<"Get the key^_^"<<endl;//输出
  cout<<"  ";
  for(int k=0;k<n;k++)
   cout<<x[a[k]];
  cout<<"+ ";
  for(k=0;k<n;k++)
   cout<<x[b[k]];
  cout<<"----------"<<endl;
  for(k=0;k<n;k++)
   cout<<x[c[k]];
  cout<<endl;
 }
}
void BackTrack(int i)//回溯
{
 if(i>=n)
  //cout<<"END"<<endl;
  Disp();
 else
 {
  for(int j=i;j<n;j++)
  {
   Swap(x[i],x[j]);
   BackTrack(i+1);
   Swap(x[i],x[j]);
  }
 }
}
int main()
{
 BackTrack(i);
 return 0;
}[/code]

[[italic] 本帖最后由 diaoxue 于 2007-12-9 10:17 编辑 [/italic]]
搜索更多相关主题的帖子: 虫蚀 回溯 
2007-12-09 10:07
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
是不是注释写的不详细啊
大家指点下啊
我自己调试了好多次,都没找到原因

上善若水,水善利万物而不争,处众人之所恶
2007-12-18 09:51
diaoxue
Rank: 1
等 级:新手上路
帖 子:142
专家分:0
注 册:2007-6-1
收藏
得分:0 
终于搞定了,就是absum数组累加了,应该每次运算结束后清零了。
/*ABCED+BDACE=EBBAA
key:10342
*/
#include <iostream>
using namespace std;

int t=0;
const int n=5;
int a[n]={0,1,2,4,3};//ABCED 在x中的下标
int b[n]={1,3,0,2,4};//BDACE 在x中的下标
int absum[n]={0};
int sum[n]={0};
int c[n]={4,1,1,0,0};//EBBAA 在x中的下标
int d[n]={0,1,2,3,4};
int x[n]={0};
void Swap(int &a,int &b)
{
    int temp=a;
    a=b;
    b=temp;
}
bool Ok()
{
    int i,j;
    for(i=0;i<n;i++)
        x[i]=d[i];
    for(j=n-1;j>0;j--)
    {
        absum[j]+=(x[a[j]]+x[b[j]]);
        absum[j-1]+=(absum[j]/5);//进位
        absum[j]=absum[j]%5;
    }
    absum[0]+=(x[a[0]]+x[b[0]]);
    for(i=0;i<n;i++)
    {
        sum[i]=absum[i];
        absum[i]=0;
    }
//    for(int k=0;k<n;k++)
//            cout<<sum[k]<<"\t";//应该是五位,怎么还输出六位,七位的啊
//    cout<<endl;
    for(j=0;j<n;j++)
    {
        if(sum[j]!=x[c[j]])//得到结果
            return false;
    }
    return true;
}
void Disp()
{
/*    for(int i=0;i<n;i++)
        x[i]=d[i];
    //    cout<<d[i]<<"\t";
//    cout<<endl;
    for(int j=n-1;j>0;j--)
    {
        absum[j]+=(x[a[j]]+x[b[j]]);
        absum[j-1]+=(absum[j]/5);//进位
        absum[j]=absum[j]%5;
    }
    absum[0]+=(x[a[0]]+x[b[0]]);
    for(int k=0;k<n;k++)
            cout<<absum[k]<<"\t";//应该是五位,怎么还输出六位,七位的啊
    cout<<endl;
    int flag=1;
    for(j=0;j<n;j++)
    {
        if(absum[j]!=x[c[j]])//得到结果
            flag=0;
    }*/
//    if(flag)
    if(Ok())
    {
        cout<<"Get the key^_^"<<endl;//输出
        cout<<"  ";
        for(int k=0;k<n;k++)
            cout<<x[a[k]];
        cout<<endl;
        cout<<"+ ";
        for(k=0;k<n;k++)
            cout<<x[b[k]];
        cout<<endl;
        cout<<"----------"<<endl;
        cout<<"  ";
        for(k=0;k<n;k++)
            cout<<x[c[k]];
        cout<<endl;
    }
}
void BackTrack(int t)//回溯
{
    if(t>=n)
    //    cout<<"END"<<endl;
        Disp();
    else
    {
        for(int j=t;j<n;j++)
        {
            Swap(d[t],d[j]);
            BackTrack(t+1);
            Swap(d[t],d[j]);
        }
    }
}
int main()
{
    BackTrack(t);
    return 0;
}

上善若水,水善利万物而不争,处众人之所恶
2008-01-10 21:49
快速回复:回溯法解决虫蚀问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020462 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved