动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.THotKey.
.深入研究 C++中的 STL.
.C++箴言:用传引用给const取代传.
.在linux下使用c语言操作临时文件.
.C++数据结构学习:二叉树(4).
.在BCB中使用VCL控件数组1.
.C++面向对象编程入门:构造函数与.
.DOS界面下通用图形编辑软件的设计.
.C++ Builder 控制窗体.
.自定义类_string类.
.打印日历.
.经典c程序100例==51--60.
.C++未来断想.
.用VC++6.0的Sockets API实现一个.
.C++中指针的使用艺术.
.用纯粹的C++编写COM组件.
.C/C++中函数指针的含义.
.我的最爱.
.关于BCB写入文件进行感染的问题.
.C语言库函数(G类字母).

对马踏棋盘的一点研究

发表日期:2008-3-8 |


 /*对马踏棋盘的一点研究*/
/* QQ:164094487          */
/* Email: fygood@163.com  */
/*欢迎与我联系,讨论问题  */
/*本人先后编了两次,第二次进行了改进。改进的思想主要是注重到棋盘上每一点的下一可到达点的个数
(下称为权值)不同,对于可到达点较少(权值小)的点应该先跳上去,这样后来跳的点可跳的方向就比
较多,回溯的现象就比较少,这样就可以大幅度提高速度*/ /*第一次*/
/*原始的马踏棋盘,未加权值,有些点速度很慢*/ #include "stdio.h"
#define N 8
int w=0;
int way1[8]={-2,-1,1,2, 2, 1,-1,-2};
int way2[8]={ 1,2, 2,1,-1,-2,-2,-1};
int ch[N*N]=;
int a[N*N+1][3]=;
int st=1;
char c='y'; void print()
{
 int x,y;
 
 printf(" ------%d answer---- ",++w);
 
 for(x=1;x<N+1;x++)
 {
  printf(" ");
  for(y=1;y<N+1;y++)
   printf("%2d ",ch[(x-1)*N+y-1]);
  printf(" ");
 }
 printf(" Press n to quit ,press any other key to continue. ");
 c=getchar();        /*询问是否继续输出结果*/
} main()  
{
 int x,y,way;
 printf("Please enter the row and column of the starting point. ");
 scanf("%d,%d",&a[1][0],&a[1][1]);/*输入行数和列数*/
 getchar();                       /*接收回车符*/
 x=a[1][0],y=a[1][1];            
 ch[(x-1)*N+y-1]=1;               /*在ch数组中对相应点赋值*/
 
 
 while(1)
 {
  if(a[1][2]>=8)                   /*出发点的八个方向都已走过,表示所有的方法均已找出*/
   break;
      if(a[st][2]>=8)   /*此点的八个方向都已走过,应该退回到上一次走的点*/
  {
   x=a[st][0];
   y=a[st][1];
  ch[(x-1)*N+y-1]=0;          /*将这一点被走过的痕迹抹去*/
   a[st][0]=a[st][1]=a[st][2]=0;
  a[st-1][2]++;               /*使上一次走的点走的方向发生变化*/
   st--;                       /*步数减一*/
  }
  
 else                             /*此点的八个方向未全走过,应走此方向*/
  {
   way=a[st][2];
   a[st][2]++;                  /*确定下次应走的方向*/
   x=a[st][0]+way1[way];       
 y=a[st][1]+way2[way];         /*确定按这次的方向走应走到的x,y坐标*/
   
   
  if(x<1y<1x>Ny>Nch[(x-1)*N+y-1]!=0)/*此点不满足要求*/
    continue;
   ch[(x-1)*N+y-1]=++st;        /*走到这一点 */
   a[st][0]=x;
   a[st][1]=y;
   a[st][2]=0;                   /*标记这一步*/
   
   if(st==N*N)                   /*步数已满*/
   {
    print();                  /*输出结果*/
    if(c=='n')
     break;
    ch[(x-1)*N+y-1]=0;
    a[st][0]=a[st][1]=a[st][2]=0;
    a[st-1][2]++;
    st--;                      /*退回前一步*/
   }
  }
 }
}
/*
第二次: 改进后的马踏棋盘,加入了每点的权值因素,速度极快*/
#include "stdio.h"
#define N 8
int w=0;
int way1[8]={-2,-1,1,2, 2, 1,-1,-2};
int way2[8]={ 1,2, 2,1,-1,-2,-2,-1};
int ch[N*N]=;
int a[N*N+1][3]=;
int dir[N][N][8];
int st=1;
char c='y';
int weight[N][N];   
void caculate();
void dirctions();
void print();
int  check(int i,int j); void caculate()      /*计算各点的权值*/
{
int i,j,k;
for(i=1;i<=N;i++)
   for(j=1;j<=N;j++)
       for(k=0;k<N;k++)
    {
     int x,y;
     x=i+way1[k];
     y=j+way2[k];
     if(x>=1&&x<=N&&y>=1&&y<=N)
      weight[i-1][j-1]++;
    } } int  check(int i,int j) /*检查(i,j)是否在棋盘内*/
{
if(i<1i>8j<1j>8)
    return 0;
return 1;
}
void directions()        /*求出各点的最佳方向序列,即优先向权值小的方向*/
{
int i,j,k,m,n1,n2,x1,y1,x2,y2,way_1,way_2;
for(i=0;i<N;i++)
   for(j=0;j<N;j++)
       {
         for(k=0;k<8;k++)
    dir[i][j][k]=k;
   for(k=0;k<8;k++)
   {
   
         for(m=k+1;m<8;m++) /*对每个方向考察看有没有更好的*/
    {
     way_1=dir[i][j][k];
     x1=i+way1[way_1];
     y1=j+way2[way_1];
              way_2=dir[i][j][m];
     x2=i+way1[way_2];
     y2=j+way2[way_2];
     n1=check(x1+1,y1+1);
     n2=check(x2+1,y2+1);
     if(  
      ( n1==0 && n2 )      /*k方向不可达到,而m方向可达到*/
      ( n1 && n2&&weight[x1][y1]>weight[x2][y2] )/*都可达到但m方向权值小*/
               )
     {
    
    dir[i][j][k]=way_2;
    dir[i][j][m]=way_1;      /*交换两个方向值*/
     }
    }
   }  
    
  
  } }
void print()
{
 int x,y;
 
 printf(" ------%d answer---- ",++w);
 
 for(x=1;x<N+1;x++)
 {
  printf(" ");
  for(y=1;y<N+1;y++)
   printf("%2d ",ch[(x-1)*N+y-1]);
  printf(" ");
 }
 printf(" Press n to quit ,press any other key to continue. ");
 c=getchar();        /*询问是否继续输出结果*/
} main()  
{
 int x,y,way,way0;
 caculate();
 directions();
 printf("Please enter the row and column of the starting point. ");
 scanf("%d,%d",&a[1][0],&a[1][1]);/*输入行数和列数*/
 getchar();                       /*接收回车符*/
 x=a[1][0],y=a[1][1];            
 ch[(x-1)*N+y-1]=1;               /*在ch数组中对相应点赋值*/
 
 
 while(1)
 {
  if(a[1][2]>=8)                   /*出发点的八个方向都已走过,表示所有的方法均已找出*/
   break;
  
  if(a[st][2]>=8)     /*此点的八个方向都已走过,应该退回到上一次走的点*/
  {
   x=a[st][0];
   y=a[st][1];
   ch[(x-1)*N+y-1]=0;          /*将这一点被走过的痕迹抹去*/
   a[st][0]=a[st][1]=a[st][2]=0;
   a[st-1][2]++;               /*使上一次走的点走的方向发生变化*/
   st--;                       /*步数减一*/
  }
  
  else                             /*此点的八个方向未全走过,应走此方向*/
  {
   way0=a[st][2];
   a[st][2]++;     /*确定下次应走的方向*/
   x=a[st][0];
   y=a[st][1];
   way=dir[x-1][y-1][way0];
   x=a[st][0]+way1[way];       
   y=a[st][1]+way2[way];         /*确定按这次的方向走应走到的x,y坐标*/
   
   
   if(x<1y<1x>Ny>Nch[(x-1)*N+y-1]!=0)/*此点不满足要求*/
    continue;
   ch[(x-1)*N+y-1]=++st;        /*走到这一点 */
   a[st][0]=x;
   a[st][1]=y;
   a[st][2]=0;                   /*标记这一步*/
   
   if(st==N*N)                   /*步数已满*/
   {
    print();                  /*输出结果*/
    if(c=='n')
     break;
    ch[(x-1)*N+y-1]=0;
    a[st][0]=a[st][1]=a[st][2]=0;
    a[st-1][2]++;
    st--;                      /*退回前一步*/
   }
  }
 }
}
 

上一篇:对五星红旗的注释 人气:372
下一篇:二级指针 人气:548
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成