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;
}