思路:按照题目要求移动就行了,就是个模拟题
注意:
1.处理好出界问题
2.有些一行只有四个字符,自己要给它补一个空格
AC码
#include <stdio.h>
#include <string.h>
//自定义函数
int move(int com);
int swash(int i1, int j1, int i2, int j2);
int prt(int k, int kase);
//定义变量和数组
char puzzle[6][6];//养成把数组定义在main函数外面的习惯
int x, y; //将x,y定义在外面避免使用指针
//主函数
int main()
{
int kase=1; //kase表示第几副拼图
while(1)
{
int i, j, k = 1;
int c;
for(i = 0; i < 5; i++)
for(j = 0; j < 6; j++)
{
puzzle[i][j] = getchar();
if(puzzle[0][0] == 'Z' && puzzle[0][1] == '\n') return 0;
if(puzzle[i][j] == ' ') {x = i; y = j;}
}
while((c = getchar()) != EOF && c != '0')
{
if(c != '\n' && move(c)) {k = 0;break;}
}
if(kase > 1) printf("\n");
if(!k) for(;;) if((c = getchar()) == '0') break;
prt(k, kase); getchar();
kase++;
}
return 0;
}
int move(int com)
{
//A=65 B=66 L=76 R=82
if(com==65){ x--; if(x < 0) return 1; swash(x, y, x + 1, y); }
if(com==76){ y--; if(y < 0) return 1; swash(x, y, x, y + 1); }
if(com==82){ y++; if(y > 4) return 1; swash(x, y, x, y - 1); }
if(com==66){ x++; if(x > 4) return 1; swash(x, y, x - 1, y); }
return 0;
}
int swash(int i1, int j1, int i2, int j2)
{
int temp = puzzle[i1][j1];
puzzle[i1][j1] = puzzle[i2][j2];
puzzle[i2][j2] = temp;
return 0;
}
int prt(int k, int kase)
{
int i, j;
//如果合法
if(k)
{
printf("Puzzle #%d:\n", kase);
for(i = 0; i < 5; i++)
for(j = 0; j < 5; j++)
{
printf("%c",puzzle[i][j]);
if(j==4) printf("\n");
else printf(" ");
}
}
//如果不合法
else
{
printf("Puzzle #%d:\n", kase);
printf("This puzzle has no final configuration.\n");
}
return 0;
}