数据结构与算法分析第一章第二个习题

下面是我的代码:

/*
* 编写一个程序求解字谜游戏问题。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LONGEST_LENGTH 4
#define COL_NUM 4
#define RAW_NUM 4

char ** initPuzzleBorad(char ** puzzleBorad, int col_num, int raw_num);
void displayPuzzleBoard(char ** puzzleBorad, int col_num, int raw_num);
void getWord(int i, int j, int k, int len, char ** dict, char ** puzzleBorad);
void inWordDict(char ** dict, char ** puzzleBorad, char * testedWord);
int charArrayCmp(char * char1, char * char2);

void printChar(char * c)
{
  int i = 0;
  while(c[i] != '\n')
  {
    printf("%c",c[i]);
    i++;
  }
  printf("\n");
}

/*
* 获得键盘上输入的最后一个字符,除了回车。
*/
char getAChar()
{
  char tempChar,realChar,firstChar;
  int i = 0;
  realChar = '\n';
  do
  {
    while ((tempChar = getchar()) != '\n')
    {
      realChar = tempChar;
      if (i == 0)
      {
        i = 1;
        firstChar = realChar;
      }
    }
    if (realChar == '\n')
    {
      printf("your input is: enter, input again:");
    }
    else if(realChar != firstChar)
    {
      printf("your input: %c \n", realChar);
    }
    
  } while (realChar =='\n');
  return realChar;
}

/*
* 获得puzzle board
*/
char ** getPuzzleBorad(int col_num, int raw_num)
{
  char ** puzzleBorad = (char **)malloc(sizeof(char *) * raw_num);
  int i = 0;
  for(i = 0; i < col_num; i++)
  {
    *(puzzleBorad + i) = (char *)malloc(sizeof(char)*col_num);
  }
  puzzleBorad = initPuzzleBorad(puzzleBorad, col_num, raw_num);
  return puzzleBorad;
}

/*
* 初始化puzzle board
*/
char ** initPuzzleBorad(char ** puzzleBorad, int col_num, int raw_num)
{
  while (1)
  {
    int i = 0;
    int j = 0;
    char aChar, asure;
    for(i = 0; i < raw_num; i++)
    {
      for(j = 0; j < col_num; j++)
      {
        printf("please input char[%d][%d]:",i,j);
        aChar = getAChar();
        *(*(puzzleBorad + i) + j) = aChar;
      }
    }

    printf("be sure that your input is:\n");
    displayPuzzleBoard(puzzleBorad, col_num, raw_num);
    
    
    asure = 'n';
    printf("are your input is correct?y/n    \n");
    asure = getAChar();
    while (!(asure == 'y' || asure == 'n'))
    {
      printf("your input is: %c, please input y or n!\n", asure);
      asure = getAChar();
    }
    if(asure == 'y')
    {
      return puzzleBorad;
    }
    else
    {
      printf("please input your data again\n");
    }
    
  }
}

/*
* 显示puzzleBorad
*/
void displayPuzzleBoard(char ** puzzleBorad, int col_num, int raw_num)
{
  int i,j;
  for(i = 0; i < raw_num; i++)
    for(j = 0; j < col_num; j++)
    {
      printf("%c ",*(*(puzzleBorad + i) + j));
      if(j == col_num - 1)
      {
        printf("\n");
      }
    }
}

/*
* 遍历puzzle board
*/
void ergodicPuzzleBorad(char ** puzzleBorad, int col_num, int raw_num, char ** wordDict)
{
  // 遍历每个位置
  int i,j,k;
  for(i = 0; i < raw_num; i++)
  {
    for(j = 0; j < col_num; j++)
    {
      for(k = 0; k < 8; k++)
      {
        // printf("position is %d hang %d lie %d fangxiang\n", i, j, k);
        getWord(i,j,k,LONGEST_LENGTH,wordDict,puzzleBorad);
      }
    }
  }
}

/*
* i: 行 j:列 k:方向 
* 获得一个字符序列
*/
void getWord(int i, int j, int k, int len, char ** dict, char ** puzzleBorad)
{
  char * temp = (char *)malloc(sizeof(char)*len*2);
  int count = 0;
  for(count = 0; count < len; count++)
    temp[count] = 'A';

  switch(k)
  {
    case 0: // upper
      for(count = 0; count < len; count++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        i--;
        if(i == -1) break;
      }
      break;
    case 1: // down
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        i++;
        if(i == RAW_NUM) break;
      }
      break;
    case 2: // left
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        j--;
        if(j == -1) break;
      }
      break;
    case 3: // right
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        j++;
        if(j == COL_NUM) break;
      }
      break;
    case 4: // upper right
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);        
        i--;j++;
        if(i == -1 || j == COL_NUM) break;
      }
      break;
    case 5: // upper left
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        i--;j--;
        if(i == -1 || j == -1) break;
      }
      break;
    case 6: // down right
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        i++;j++;
        if(i == RAW_NUM || j == COL_NUM) break;
      }
      break;
    case 7: // down left
      for(count = 0; count < len; count ++)
      {
        *(temp + count) = *(*(puzzleBorad + i) + j);
        *(temp + count + 1) = '\n';
        // printf("the word getted is:");
        // printChar(temp);
        inWordDict(dict, puzzleBorad, temp);
        i++;j--;
        if(i == RAW_NUM || j == -1) break;
      }
      break;
    default:
      printf("error: no such directory!");
  }
  free(temp);
}

void inWordDict(char ** dict, char ** puzzleBorad, char * testedWord)
{
  int i = 0;
  int maxNumWord = 4;
  for(i = 0; i < maxNumWord; i++)
  {
    // printf("the word 1 is:%s\n",testedWord);
    // printf("the word 2 is:%s\n",dict[i]);
    // printf("------------------------");
    if(charArrayCmp(testedWord, dict[i]) == 0)
    {
      printf("the puzzle board has the word:%s\n",dict[i]);
    }
  }
}

int charArrayCmp(char * char1, char * char2)
{
  int i = 0;
  while (char1[i] !='\n' && char2[i] != '\n')
  {
    // printf("%d-th char is %c in char1 and %c in char2\n",i, char1[i], char2[i]);
    if(char1[i] != char2[i])
      return 1;
    i++;
  }
  return 0;
}

int main()
{
  char *wordDict[4] = {"this", "two", "fat", "that"}; //字典
  char ** puzzleBoard = getPuzzleBorad(COL_NUM, RAW_NUM);
  ergodicPuzzleBorad(puzzleBoard,COL_NUM,RAW_NUM, wordDict);
  free(puzzleBoard);
  printf("program finished!");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值