Weiss-(DSAA - in C,1.3)字谜游戏

本文档介绍了如何编写程序来解决字谜游戏问题,主要聚焦于C语言实现的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.3 编写程序求解字谜游戏问题

/*
    原理:由于字谜游戏,需要从不同方向组合,所以本程序大致上分了3个方向:

  1.纵向 -- (含逆向和顺序)
 2.横向 -- (同上)
  3.对角 -- (左上,右上,左下,右下)

  用循环厉遍字谜表中每一个元素,再对每个元素进行各个方向的匹配,找出正确的单词组合。

  注意:注释中的 “方向1”为 左上   “方向3”为 右上

                “方向2”为 右下   “方向4”为 左下

采用直观的方法描述,由于是做习题,所以没有参考网上的答案。

*/


#include <iostream>
#include <string>
using namespace std;

string answer[5] = {"two","log","that","dog","odd"};
size_t counter = 0;
size_t total = sizeof(answer)/sizeof(string);

void check(string vs)
{
    for(int i=0;i<total;i++)
    {
        if (vs == answer[i])
        {
            counter++;
            //cout<<"test:"<<vs<<endl;
        }

    }
}
int main()
{
    //字谜表
    char guess[4][4] = {{'l','g','i','t'},
                        {'t','o','d','a'},
                        {'w','d','g','h'},
                        {'o','g','d','t'},};
    string str1 = "",str2 = "",str3 = "";

    for (int i=0;i<=3;i++)
    {
        for (int j=0;j<=3;j++)
        {
            //--------------------------横向顺序--------------------------
            for (int k=j;k<=3;k++)
            {
                str1 += guess[i][k];
                check(str1);
            }
            //--------------------------横向逆序--------------------------
            if (j!=0)
            {
                string str1_1 = "";
                for (int k=j;k>=0;k--)
                {
                    str1_1 += guess[i][k];
                    check(str1_1);
                }
            }
            str1 = "";

            //--------------------------纵向顺序--------------------------
            for (int k=j;k<=3;k++)
            {
                str2 += guess[k][i];
                check(str2);

            }
            //--------------------------纵向逆序--------------------------
            if(i!=0)
            {
                string str2_2 = "";
                for (int k=i;k>=0;k--)
                {
                    str2_2 += guess[k][j];
                    check(str2_2);
                }
            }
            str2 = "";


            //---------------------------对角---------------------------
            int indexI = 0,indexJ = 0;
            //no problem!! 方向1
            if(!(i==0||j==0))
            {
                indexI = i;
                indexJ = j;
                int d = (i<j?i:j);
                if (i==j)
                    d = i;
                for (int k=d;k>=0;k--)
                {
                    str3 += guess[indexI--][indexJ--];
                    check(str3);
                }
                str3 = "";
            }
            //done bug方向2
            if(!(j==3||i==3))
            {
                indexI = i;
                indexJ = j;
                int d = i<j? j:i;//决定第三层循环的次数
                for (int k=0;k<=3-d;k++)
                {
                    str3 += guess[indexI++][indexJ++];
                    check(str3);
                }
                str3 = "";
            }

            //done bug.方向3
            if (!(i==0 || j==3))
            {
                indexI = i;
                indexJ = j;
                int d;
                if (i==1)
                    d = i;
                else if (i==2)
                {
                    if (j==0||j==1)
                        d = 2;
                    else
                        d = 1;
                }
                else if (i==3)
                    d = i-j;
                for (int k=0;k<=d;k++)
                {
                    str3 += guess[indexI--][indexJ++];
                    check(str3);
                }
                str3 = "";
            }

            //方向4
            //done bug

            if (!(i==3 || j==0))
            {
                indexI = i;
                indexJ = j;
                int d;
                if (i==0)
                    d = j;
                else if (i==1)
                {
                    if (j==1)
                        d = 1;
                    else
                        d = 2;
                }
                else if (i==2)
                    d = 1;
                for (int k=0;k<=d;k++)
                {
                    str3 += guess[indexI++][indexJ--];
                    check(str3);
                }
                str3 = "";
            }
        }
    }

    cout<<"total number:"<<counter;
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值