我编写了以下代码,该代码接收用户的文字,将它们从最长到最短排序,然后检查是否有可能放置该单词的位置。我遇到的问题是弄清楚如何检查这个词是水平放置还是垂直放置。任何帮助将不胜感激。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
void initialize_board(char board[][15]);
void get_user_info(char words[][16], int *numbofwords);
void sort_words(char words[][16], int numbofwords);
void display_solution_board(char board[][15]);
void place_words(char board[][15], char words[][16], int numbofwords);
int check_if_fits(char board[][15], char * word, int *j, int *n);
int main(){
char words[20][16];
char board[15][15];
int numbofwords = 0;
int i;
//create a board of all pound symbols
initialize_board(board);
//get words for crossword from user
get_user_info(words, &numbofwords);
//sort words array to go from longest word to shortest
sort_words(words,numbofwords);
//places the words in appropriate places
place_words(board,words,numbofwords);
//displays the output of the board with answers
display_solution_board(board);
}
void initialize_board(char board[][15]){
int j,k;
for(j = 0; j < 15; j++){
for(k = 0; k < 15; k++){
strcpy(&board[j][k],"#");
}
}
}
void get_user_info(char words[][16], int *numbofwords){
char word[16];
int i = 0;
printf("Please enter up to 20 words of up to 15 characters in length.\n");
printf("Use a period to end your input if you want less than 20 words.\n");
scanf("%s", word);
while(strcmp(word, ".") != 0){
strcpy(words[i],word);
i++;
if(i == 20){
break;
}
scanf("%s", word);
}
*numbofwords = i;
}
void sort_words(char words[][16], int numbofwords){
int i, j;
char temp[16];
for(i = 0; i < numbofwords-1; i++){
for(j = 0; j < numbofwords-i-1;j++){
if(strlen(words[j]) < strlen(words[j+1])){
strcpy(&temp[0],words[j]);
strcpy(words[j],words[j+1]);
strcpy(words[j+1],&temp[0]);
}
}
}
}
void display_solution_board(char board[][15]){
int j,k;
for(j = 0; j < 15; j++){
for(k = 0; k < 15; k++){
printf("%c",board[j][k]);
}
printf("\n");
}
}
void place_words(char board[][15], char words[][16], int numbofwords){
int i,j,k,max;
int n,r = 0;
//sets the longest word in the middle of the grid
max = strlen(words[0]);
printf("max is %d\n",max);
printf("num words is %d\n",numbofwords);
strncpy(&board[7][(15-max)/2],words[0], strlen(words[0]));
//goes through all other words to find a place for them
for(i = 1; i < numbofwords; i++){
if(check_if_fits(board,words[i],&j,&k) == 0 && check_vertical_placement(board,words[i],j,k) == 0){
//printf("The word %s fits in col %d and row %d\n", words[i],k,j);
for(k = k;k < strlen(words[i]);k++){
board[j][k] = words[i][r];
r++;
}
}else if(check_if_fits(board,words[i],&j,&k) == 0 && check_horizontal_placement(board,words[i],j,k) == 0){
//printf("The word %s fits in col %d and row %d\n", words[i],k,j);
for(j = j; j < strlen(words[i]); j++){
board[j][k] = words[i][n];
n++;
}
}else if(check_if_fits(board,words[i],&j,&k) == 1){
printf("The word %s doesn't fit\n", words[i]);
}
}
}
int check_if_fits(char board[][15], char * word, int *j, int *n){
int k,t,h,g;
for(t = 0; t < 15; t++){
for(h = 0; h < 15; h++){
for(k = 0; k < strlen(word); k++){
if(board[t][h] == word[k]){
*j = t+1;
*n = h+1;
return 0;
}
}
}
}
return 1;
}
int check_horizontal_placement(char board[][15],char * word, int j,int k){
int i,val;
for(i = k; i < strlen(word);i++){
if(board[j][i] == '#' && board[j+1][i] == '#' && board[j-1][i] == '#') val = 0;
}
if(val == 0) return(0);
else{return(1);}
}
int check_vertical_placement(char board[][15],char * word, int j,int k){
int i,val;
for(i = j; i < strlen(word);i++){
if(board[i][k] == '#' && board[i][k+1] == '#' && board[i][k-1] == '#') val = 0;
}
if(val == 0) return(0);
else{return(1);}
}
答案 0 :(得分:0)
您对如何检查单词是否合适有任何建议吗? 从中间一排?
使用
替换place_words()
循环for(i = 1; i < numbofwords; i++)
的正文
switch (check_if_fits(board, words[i], &j, &k))
{
case -1:// vertical_placement
//printf("The word %s fits in col %d and row %d\n", words[i],k,j);
for (r = 0; r < strlen(words[i]); r++) board[j+r][k] = words[i][r];
break;
case 0: // horizontal_placement
//printf("The word %s fits in col %d and row %d\n", words[i],k,j);
for (n = 0; n < strlen(words[i]); n++) board[j][k+n] = words[i][n];
break;
case 1:
printf("The word %s doesn't fit\n", words[i]);
}
替换行*j = t+1;
*n = h+1;
check_if_fits()
if (check_vertical_placement(board, word, *j=t-k, *n=h)==0)
return -1;
if (check_horizontal_placement(board, word, *j=t, *n=h-k)==0)
,检查两个展示位置:
int check_horizontal_placement(char board[][15], char *word, int j, int k)
{
int i;
if (k < 0 || 15 < k+strlen(word)) return 1; // word outside board
if (k && board[j][k-1] != '#') return 1; // another word in front
for (i = 0; i < strlen(word); i++)
if (board[j][k+i] != '#' && board[j][k+i] != word[i]) return 1;
if (k+i < 15 && board[j][k+i] != '#') return 1; // another word behind
return 0;
}
int check_vertical_placement(char board[][15], char *word, int j, int k)
{
int i;
if (j < 0 || 15 < j+strlen(word)) return 1; // word outside board
if (j && board[j-1][k] != '#') return 1; // another word in front
for (i = 0; i < strlen(word); i++)
if (board[j+i][k] != '#' && board[j+i][k] != word[i]) return 1;
if (j+i < 15 && board[j+i][k] != '#') return 1; // another word behind
return 0;
}
和检查功能
$(function() {
$('.some_parent_class').on('click', '#ajax_articulos', function() {
//Handler...
}
})