不知道为什么,越是觉得自己不行,越是坚定,有想要拼到底的感觉.
看算法书中一道题,很普通的马踏棋盘问题,只让求是否存在,用分治法做.我本来很不在乎这道题,认为拿来就能写,写了就可以运行,没想到却在这上面除了很多毛病,让我感觉十分沮丧,对目标也更没有信心.
#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,怎么也计算不完了.要真做还是做个贪心的算法好.