马踏棋盘让人愁2006-07-20

  不知道为什么,越是觉得自己不行,越是坚定,有想要拼到底的感觉.

  看算法书中一道题,很普通的马踏棋盘问题,只让求是否存在,用分治法做.我本来很不在乎这道题,认为拿来就能写,写了就可以运行,没想到却在这上面除了很多毛病,让我感觉十分沮丧,对目标也更没有信心.

  #include <stdio.h>
#include <stdlib.h>
#define N 8
int b[N][N];
int c[N*N][2];
int hmove(int x,int y,int n,int s){
 int flag=0;
 if(b[x][y]==1)
  return 0;
 if(s==N*N){
  c[s-1][0]=x;
  c[s-1][1]=y;
  return 1;
 }
 b[x][y]=1;//暂时选定
 //先是偏y的方法
 if(x-1>=0&&y-2>=0&&hmove(x-1,y-2,n,s+1)==1)//左上
  flag=1; 
 else if(x+1<n&&y+2<n&&hmove(x+1,y+2,n,s+1)==1)//右下
  flag=1;
 else if(x-1>=0&&y+2<n&&hmove(x-1,y+2,n,s+1)==1)//左下
  flag=1;
 else if(x+1<n&&y-2>=0&&hmove(x+1,y-2,n,s+1)==1)//右上
  flag=1;
 //偏x的方法
 else if(y-1>=0&&x-2>=0&&hmove(x-2,y-1,n,s+1)==1)//左上
  flag=1;
 else if(y+1<n&&x+2<n&&hmove(x+2,y+1,n,s+1)==1)//右下
  flag=1;
 else if(y-1>=0&&x+2<n&&hmove(x+2,y-1,n,s+1)==1)//右上
  flag=1;
 else if(y+1<n&&x-2>=0&&hmove(x-2,y+1,n,s+1)==1)//左下
  flag=1;

 if(flag==0)
  b[x][y]=0;
 else{
  c[s-1][0]=x;
  c[s-1][1]=y;
 }

 return flag;
  
}

int main(){
 //int a[3][3];
 //int *q=&a[0][0];
 //int **p=&q;
 printf("%d/n",hmove(0,0,N,1));
 for(int i=0;i<N*N-1;i++){
  printf("第%d步:%d,%d/n",i+1,c[i][0],c[i][1]);
 }
 return 0;
}

就这么一道题,一开始出的问题是判断语句有毛病,再就是根本不存在"正确的情况",忘了写一个判断最小划分正确的语句了.结果答案肯定是全部错误了.

直到今天上午在网上找一些例子,一些贪心算法的例子,才猛然想起来......

改正了以后,发现总是差一步,便写了几句来看到底那是哪几步,又发现有个毛病.

我不知道到底是疏忽,思维不周密,还是根本我的逻辑思维有重大问题......总之,走着瞧吧.

还要说一下,这程序只是递归的例子,6X6还是可以的,一旦到8X8,怎么也计算不完了.要真做还是做个贪心的算法好.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值