一道逻辑推理题的C++实现
2015-07-31 14:12
633 查看
题目为“周游的骑士”,来自一本逻辑推理书。
![](http://img.blog.csdn.net/20150731140912222)
代码实现如下:
核心思想是用mytry递归函数来实现,check_ok函数测试线索是否成立。
代码实现如下:
核心思想是用mytry递归函数来实现,check_ok函数测试线索是否成立。
#include <stdio.h> #include <iostream> //by Soloe@csdn.net 转载请注明 #define EMPTY (-1) using namespace std; int b[4][5]; enum Name {kaowode,baoqiu,shaolifuleide,sibainisi,dimide }; enum Month {m1,m3,m5,m7,m9 }; enum Week {w3,w4,w5,w6,w7 }; enum Place {haitan,cunbian,senlin,zhaozehuangye,hebian }; enum ROW { NAME,MONTH,WEEK,PLACE }; char sName[][80]= {"kaowode","baoqiu","shaoli","sibai","dimide" }; char sMonth[][80]= {"m1","m3","m5","m7","m9" }; char sWeek[][80]= {"w3","w4","w5","w6","w7" }; char sPlace[][80]= {"haitan","cunbian","senlin","zhaoze","hebian" }; void printboard() { int i,j; for(j=0; j<5; j++) { cout<<sName[ b[NAME][j] ]<<"\t"; cout<<sMonth[ b[MONTH][j] ]<<"\t"; cout<<sPlace[ b[PLACE][j] ]<<"\t"; cout<<sWeek[ b[WEEK][j] ]<<"\t"; cout<<endl; } return; } bool check_ok(int r, int c) { int i,j,k; //rule1 1 haitan对应7周 if(b[WEEK][c]==(w7) && b[PLACE][c]!= EMPTY && b[PLACE][c]!= (haitan)) return false; //r2 9月的周期比 shaolifuleide 的周期多2周 for(j=0; j<5; j++) { if(b[MONTH][j] == m9 && b[WEEK][j]!=EMPTY && b[WEEK][shaolifuleide]!=EMPTY) { if(b[WEEK][j] - b[WEEK][shaolifuleide] != 2) return false; } } //r3 dimide不是1月,他比森林中的周期大 1 周 if(b[MONTH][dimide] != EMPTY && b[MONTH][dimide] == m1) return false; for(j=0; j<5; j++) { if(b[PLACE][j] == senlin && b[WEEK][j]!=EMPTY && b[WEEK][dimide]!=EMPTY) { if(b[WEEK][dimide] - b[WEEK][j] != 1) return false; } } //r4 村边的骑士不是9月份 for(j=0; j<5; j++) { if(b[PLACE][j] == cunbian && b[MONTH][j]!=EMPTY ) { if(b[MONTH][j] == m9) return false; } } //r5 baoqiu在沼泽荒野,不是4周 if(b[PLACE][baoqiu] != EMPTY && b[PLACE][baoqiu] != zhaozehuangye) return false; if(b[WEEK][baoqiu] != EMPTY && b[WEEK][baoqiu] == w4 ) return false ; //r6 6周对应3月 for(j=0; j<5; j++) { if(b[WEEK][j] == w6 && b[MONTH][j]!=EMPTY ) { if(b[MONTH][j] != m3 ) return false; } } //r7 sibainisi对应5周 if(b[WEEK][sibainisi] != EMPTY && b[WEEK][sibainisi] != w5 ) return false ; //by Soloe@csdn.net 转载请注明 //r8 kaowode对应7月 if(b[MONTH][kaowode] != EMPTY && b[MONTH][kaowode] != m7) return false; return true; } void mytry(int count)//by Soloe@csdn.net 转载请注明 { int i,j; char ss; int col,row; col = count%5; row = count/5; for(i=0; i<5; i++) { b[row][col]=i; bool flagchongfu = false; for(j=0; j<col; j++) { if(i == b[row][j] ) { flagchongfu = true; break; } } if(flagchongfu) continue; if(check_ok(row,col)) { if(count >= 19) { printboard(); //cin>>ss; continue ; //return ; } else mytry(count+1); } else continue; } b[row][col]=EMPTY; return ; } int main() { int i,j; for(i=0; i<5; i++) for(j=0; j<5; j++) b[i][j]=EMPTY; for(j=0; j<5; j++) b[0][j]=j; //b[0][0]=3; mytry(5);//by Soloe@csdn.net 转载请注明 //mytry(0); //printboard(); return 0; }
相关文章推荐
- 自相关函数及c++程序
- curllib上传文件c/c++
- C++导出函数,C++Invoke再次封装,C#调用
- C语言的标准化
- 在C语言中 i++与++i的区别
- C语言的inline
- C#与VC++数据类型对应关系
- c语言中的宏,#号##号,可变参数
- 动态规划之Jury Compromise
- C语言字节对齐
- RPG游戏
- 分球问题(DP/C++)
- C++ Virtual详解
- OC语言(二)
- C++获取一个目录下的所有文件
- 关于C++ const 的全面总结
- c++ 计蒜客第21题最大子阵列
- 函数调用时函数栈状态分析
- 黑马程序员---iOS基础---C语言中的位运算,文件操作等问题
- C/C++内存泄漏及检测