编写一个程序求解字谜游戏问题
2017-05-09 13:36
489 查看
题目
编写一个程序求解字谜游戏问题。
思路
借鉴前辈的思路
第一种:对单词表中的每个单词,我们检查每一个有序三元组(行,列,方向),验证是否有单词存在。但坏处是这将导致大量嵌套的for循环。
第二种:对于每一个尚未进行到字谜最后的有序四元组(行,列,方向,字符数)我们可以测试所指的单词是否在单词表中。这也导致使用大量嵌套的for循环。如果在任意单词中的最大字符数已知的情况下,那么该算法有可能节省一些时间。
实现
代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char puzzle[4][4] = {
{'t','h','i','s'},
{'w','a','t','s'},
{'o','a','h','g'},
{'f','g','g','t'}
};
char *dict[4] = {"this","two","fat","that"};
int wordExist(int x, int y, int dir, int strlen, char *word, int (*position)[2]);
int main(void)
{
char word[5];
int position[4][2];
int x, y, dir, strlen;
for(x=0;x<4;x++){
for(y=0;y<4;y++){
for(dir=0;dir<8;dir++){
for(strlen=2;strlen<5;strlen++){
// 坐标 x y
// 方向 dir
// 单词长度从2开始
if(wordExist(x, y, dir, strlen, word, position) == 1){
printf("word: %s\n",word);
break;
}
}
}
}
}
return 0;
}
int wordExist(int x, int y, int dir, int strlen, char *word, int position[][2])
{
char sword[5];
int i = 0, j;
while(i < strlen){
position[i][0] = x;
position[i][1] = y;
sword[i++] = puzzle[x][y];
sword[i] = '\0';
for(j=0;j<4;j++){
if(strcmp(sword,dict[j]) == 0){
strcpy(word,dict[j]);
return 1;
}
}
switch (dir){
case 0: //从左到右
y++;
break;
case 1: //从右到左
y--;
break;
case 2: //从上到下
x++;
break;
case 3: //从下到上
x--;
break;
case 4: //从左上到右下
x++;
y++;
break;
case 5: //从右下到左上
x--;
y--;
break;
case 6: //从左下到右上
x--;
y++;
break;
case 7: //从右上到左下
x++;
y--;
break;
default:
puts("Direction error.");
return 0;
}
if(x < 0 || y < 0)
return 0;
}
return 0;
}
结果:
原文地址:http://www.cnblogs.com/mingc/p/5861745.html
对其代码有做过一些优化,降低循环次数。
编写一个程序求解字谜游戏问题。
思路
借鉴前辈的思路
第一种:对单词表中的每个单词,我们检查每一个有序三元组(行,列,方向),验证是否有单词存在。但坏处是这将导致大量嵌套的for循环。
第二种:对于每一个尚未进行到字谜最后的有序四元组(行,列,方向,字符数)我们可以测试所指的单词是否在单词表中。这也导致使用大量嵌套的for循环。如果在任意单词中的最大字符数已知的情况下,那么该算法有可能节省一些时间。
实现
代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char puzzle[4][4] = {
{'t','h','i','s'},
{'w','a','t','s'},
{'o','a','h','g'},
{'f','g','g','t'}
};
char *dict[4] = {"this","two","fat","that"};
int wordExist(int x, int y, int dir, int strlen, char *word, int (*position)[2]);
int main(void)
{
char word[5];
int position[4][2];
int x, y, dir, strlen;
for(x=0;x<4;x++){
for(y=0;y<4;y++){
for(dir=0;dir<8;dir++){
for(strlen=2;strlen<5;strlen++){
// 坐标 x y
// 方向 dir
// 单词长度从2开始
if(wordExist(x, y, dir, strlen, word, position) == 1){
printf("word: %s\n",word);
break;
}
}
}
}
}
return 0;
}
int wordExist(int x, int y, int dir, int strlen, char *word, int position[][2])
{
char sword[5];
int i = 0, j;
while(i < strlen){
position[i][0] = x;
position[i][1] = y;
sword[i++] = puzzle[x][y];
sword[i] = '\0';
for(j=0;j<4;j++){
if(strcmp(sword,dict[j]) == 0){
strcpy(word,dict[j]);
return 1;
}
}
switch (dir){
case 0: //从左到右
y++;
break;
case 1: //从右到左
y--;
break;
case 2: //从上到下
x++;
break;
case 3: //从下到上
x--;
break;
case 4: //从左上到右下
x++;
y++;
break;
case 5: //从右下到左上
x--;
y--;
break;
case 6: //从左下到右上
x--;
y++;
break;
case 7: //从右上到左下
x++;
y--;
break;
default:
puts("Direction error.");
return 0;
}
if(x < 0 || y < 0)
return 0;
}
return 0;
}
结果:
原文地址:http://www.cnblogs.com/mingc/p/5861745.html
对其代码有做过一些优化,降低循环次数。
相关文章推荐
- 【数据结构与算法分析1.2】编写一个程序求解字谜游戏问题
- 编写一个程序求解字谜游戏
- 从易到难编写C++程序,(8)问题:实现一个矩阵类
- 【C语言编程】编写一个程序解决选择问题,令k=n/2
- 使用Python编写程序求解数独游戏答案
- 编写一个程序解决选择问题
- 编写一个程序解决选择问题
- 定义一个结构体变量(包括年、月、日),编写程序,要求输入年月日,程序能够计算并输出改日是本年中的第几天。注意闰年问题。(数组)
- 编写一个程序,使用fork函数来创建一个子进程,并且说明父进程和子进程的随机返回问题
- java数据结构与算法分析学习(编写一个程序解决选择问题,k=N/2)
- 编写一个小小游戏程序,猜拳
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- 定义一个结构体变量(包括年、月、日),编写程序,要求输入年月日,程序能够计算并输出改日是本年中的第几天。注意闰年问题。(switch语句)
- 问题六十八: 在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。 选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
- 【数据结构与算法分析】1.2 编写程序解决字谜问题
- 编写一个程序解决选择问题
- 从易到难编写C++程序,(3)问题:实现一个复杂的猜数字游戏
- 尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题。现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示同一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示时为三位数1、7、3。按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11。
- 解决Android客户端运行Cococs2dx编写的游戏程序遇到的意外游戏中断导致的游戏黑屏问题
- 某朋友说,如果存款超过100万,则入手宝马X5,否则超过50万,则 1. 入手奥迪A6,否则超过20万,则入手比亚迪,否则超过10万则玩玩极品飞车游戏,请编写一个购车选择程序,根据输入的金额,提示可以