您的位置:首页 > 编程语言 > C语言/C++

一道逻辑推理题的C++实现

2015-07-31 14:12 633 查看
题目为“周游的骑士”,来自一本逻辑推理书。



代码实现如下:

核心思想是用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: