题目如上,我对字符串的一些操作还不是很熟练,所以在处理输入时耗费了很长的时间。
显然,这道题目里出现了空格,所以我不能用scanf,而在这里我用了二维数组用gets读取的方法。
在使用scanf时,因为我使用的是VS2022,scanf的使用有点麻烦,就在开头加上了那个define。
#define _CRT_SECURE_NO_WARNINGS
//VS2022才需要这样 否则后面需要使用scanf_s并且也有一些不同
#include<stdio.h>
#include<string.h>
char command[10000];
int main(void)
{
char s[5][6] = { 0 };
int blank_x, blank_y;
for (int i = 0; i < 5; i++)
{
gets(s[i]);
//gets函数的用法!!直接就是gets(字符串数组)
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (s[i][j] == ' ')
{
blank_x = i;
blank_y = j;
}
}
}
/*printf("blank_x=%d,blank_y=%d\n", blank_x, blank_y);*/
gets(command);
/*printf("%s\n", command);*/
//直接使用gets函数就可以了
int len = strlen(command);
int flag=1;
for (int i = 0; i < len; i++)
{
/*printf("%c\t", command[i]);*/
if (command[len-1] == '0' || command[i] == 'A' || command[i] == 'B' || command[i] == 'L' || command[i] == 'R')
{
if (command[i] == 'A' && blank_x != 0)
{
s[blank_x][blank_y] = s[blank_x - 1][blank_y];
blank_x--;
s[blank_x][blank_y] = ' ';
}
else if (command[i] == 'B' && blank_x != 4)
{
s[blank_x][blank_y] = s[blank_x + 1][blank_y];
blank_x++;
s[blank_x][blank_y] = ' ';
}
else if (command[i] == 'L' && blank_y!= 0)
{
s[blank_x][blank_y] = s[blank_x][blank_y-1];
blank_y--;
s[blank_x][blank_y] = ' ';
}
else if (command[i] == 'R' && blank_y!= 4)
{
s[blank_x][blank_y] = s[blank_x][blank_y+1];
blank_y++;
s[blank_x][blank_y] = ' ';
}
else if (command[i] == '0')
break;
}
else
{
//存在不合法字符指令
flag = 0;
break;
}
}
if (flag == 0)
{
printf("This puzzle has no final configuration.");
}
else
//接下来控制输入指令 控制指令中不会有空格 0为结束标志
{
for (int j = 0; j < 5; j++)
{
for (int k = 0; k < 5; k++)
{
printf("%c ", s[j][k]);
}
printf("\n");
}
}
return 0;
}