| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 346 人关注过本帖
标题:求助帖。。。不知道这个算法错在哪里了。。
取消只看楼主 加入收藏
liuyu2524012
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-6-18
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
求助帖。。。不知道这个算法错在哪里了。。
#include <string.h>
#include "iostream.h"
#include <stdio.h>
#include <fstream.h>

//=======================================
//结构体
typedef unsigned char BYTE;
typedef struct{
    BYTE  aa[5][5];
   
}pp;
//===============================================
//构造基本图形
BYTE pc00[5][5]={{1,1,1},{1},{1}};
BYTE pc01[5][5]={{2,2},{2},{2,2}};
BYTE pc02[5][5]={{3,3},{3,3},{3}};
BYTE pc03[5][5]={{4,4},{4},{4},{4}};
BYTE pc04[5][5]={{5},{5,5},{0,5},{0,5}};
BYTE pc05[5][5]={{6},{6,6},{6},{6}};
BYTE pc06[5][5]={{7,7,7},{0,7},{0,7}};
BYTE pc07[5][5]={{0,8},{8,8,8},{0,8}};
BYTE pc08[5][5]={{0,9},{9,9},{0,9,9}};
BYTE pc09[5][5]={{10,10,10,10,10}};
BYTE pc10[5][5]={{0,11,11},{11,11},{11}};
BYTE pc11[5][5]={{12,12},{0,12},{0,12,12}};
pp* orig[]={
    (pp*)pc00,
    (pp*)pc01,
    (pp*)pc02,
    (pp*)pc03,
    (pp*)pc04,
    (pp*)pc05,
    (pp*)pc06,
    (pp*)pc07,
    (pp*)pc08,
    (pp*)pc09,
    (pp*)pc10,
    (pp*)pc11,   
};
typedef struct{
    BYTE poa[60];
    BYTE mark[12];   
}fboard;
//==================================================
//全局变量
pp var[12][8];
int nvar[12];
int brow=0,bcol=0;
int flg=-1;
//==================================================
//计算数组下标函数
int addr(int row,int col){
    return(row-1)*bcol+col-1;
}
//==================================================
//旋转函数
void rotp(pp* des,pp* src){
    memset(des,0,sizeof(pp));
    for(int x=4,flag=0,xp=0;x>=0;x--){
       for(int y=0;y<5;y++){
         des->aa[xp][y]=src->aa[y][x];
         if(src->aa[y][x])flag=1;
       }
       if(flag)xp++;
    }
    cout<<"rotp"<<endl;
}
//===================================================
//翻转函数
void flip(pp* des,pp* src){
memset(des,0,sizeof(pp));
  for(int x=4,flag=0,xp=0;x>=0;x--){
   for(int y=0;y<=5;y++){
     des->aa[y][xp]=src->aa[y][x];
     if(src->aa[y][x])flag=1;
   }
   if(flag)xp++;
  }
  cout<<"flip"<<endl;
}
//=====================================================
//初始化数组
void init(){
    pp tmp1,tmp2;
    for(int b=0;b<12;b++){
        tmp1=*orig[b];
        int d;   
        int vc=0;
        for( d=0;d<5;d++)
          for(int c=0;c<5;c++)
            if(tmp1.aa[d][c])tmp1.aa[d][c]|=0x10;
            for(int a=0;a<8;a++){
                int exist=0,c;
                for(c=0;c<vc&&!exist;c++)
                if(memcmp(&var[b][c],&tmp1,sizeof(pp))==0)exist=1;
                if(!exist) var[b][vc++]=tmp1;//旋转
                tmp2=tmp1;rotp(&tmp1,&tmp2);//翻转
                if(a==3){tmp2=tmp1;flip(&tmp1,&tmp2);}
                }
                nvar[b]=vc;
    }
    cout<<"init"<<endl;
}
//=======================================================
//检测图形是否覆盖完全函数
bool check(pp* tryp,fboard *ff,int px,int py){
   for(int row=0;row<5;row++)
     for(int col=0;col<5;col++)
       if(tryp->aa[row][col]){
          int r=row+py,c=col+px;
          if(r>brow||c>bcol||ff->poa[addr(r,c)])return 0;
        }
    return 1;
    cout<<"check"<<endl;
}

//=======================================================
//输出函数
void outf(fboard *ff)
{
   if(flg){
      for(int col=1;col<=bcol;col++){
        for(int row=1;row<=brow;row++){
        int x=ff->poa[addr(row,col)]-16;
        if(x<10)cout<<x;
        if(x==10)cout<<"a";
        if(x==11)cout<<"b";
        if(x==12)cout<<"c";
      }
      cout<<endl;
   }
}
     else{
        for(int row=1;row<=brow;row++){
        for(int col=1;col<=bcol;col++){
        int x=ff->poa[addr(row,col)]-16;
        if(x<10)cout<<x;
        if(x==10)cout<<"a";
        if(x==11)cout<<"b";
        if(x==12)cout<<"c";
        }
      cout<<endl;
        }
    }
cout<<"outf"<<endl;
}
//======================================================
//回溯搜索函数

void search(fboard *pre){
   int  ans=0;
   int  npla=0,frow=0,fcol=0;
   fboard ff=*pre;
   if(ans>0) return;
   //找最左上的未覆盖方格
   for(int row=1,found=0;row<=brow&&!found;row++)
      for(int col=1;col<=bcol&&!found;col++)
         if(pre->poa[addr(row,col)]==0){
         frow=row;fcol=col;found=1;
         }
         //计算已经用过的图形数      
         int pn;
         for(pn=0;pn<12;pn++)if(pre->mark[pn]) npla++ ;
         for(pn=0;pn<12;pn++){
             //是否用过
           if(pre->mark[pn])continue;
           //每种不同形态
           for(int pv=0;pv<nvar[pn];pv++){
             pp tryp=var[pn][pv];
             int py=frow;
             for(int px=1;px<=bcol;px++){
               if(px>fcol)break;
               if(check(&tryp,&ff,px,py)){
                 //用该图形覆盖一下
                  for(int row=0;row<5;row++){
                     for(int col=0;col<5;col++){
                       ff.poa[addr(row+py,col+px)]=tryp.aa[row][col];
                     }
                  }
                  ff.mark[pn]=1;
                  if(npla>10){++ans;outf(&ff);return;}
                  else search(&ff);
                  //回溯
                  ff=*pre;
                }//if
              }//px      
            }//pv
          }//pn
     cout<<"search"<<endl;
}
//============================================================
//主函数

int main()
{
    cin>>brow>>bcol;
    if(brow<bcol){int tmp=brow;brow=bcol;bcol=tmp;flg=1;}
    if(bcol<3||brow*bcol!=60)cout<<"No Solution!"<<endl;
    else{
       init();
       fboard ff;
       memset(&ff,0,sizeof(fboard));
       search(&ff);
    }
    return 0;
}

正确的输入输出结果:~~~~~~~~~~~~~~~~~~~~~~~~
input.txt                     output.txt
6 10                          111c9aaaaa
                              1ccc999777
                              1c3339bb74
                              22233bb874
                              26255b8884
                              6666555844
搜索更多相关主题的帖子: include 结构体 
2014-06-18 13:34
快速回复:求助帖。。。不知道这个算法错在哪里了。。
数据加载中...
 
   



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

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