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

题目为“周游的骑士”,来自一本逻辑推理书。
096周游的骑士

代码实现如下:
核心思想是用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;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值