习题3-5 谜题

谜题

有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”。

#include "pch.h"
#include <iostream>
using namespace std;

void swap(char &x, char &y)
{
	char temp;
	temp = x;
	x = y;
	y = temp;
}

int main()
{
	int r = 0, c = 0, i = 0, j = 0;
	bool islegal = true;
	char grid[6][6];
	char s[105];
	memset(grid, '\0', sizeof(grid));
	memset(s, '\0', sizeof(s));
	for (int m = 0; m < 5; m++)//输入初始网格(注意结束不要输入换行)
	{
		for (int n = 0; n < 5; n++)
		{
			grid[m][n] = getchar();
		}
	}
	for (int m = 0; m < 5; m++)//查找网格中的空格并将空格所在行和列索引分别保存在r和c中
	{
		for (int n = 0; n < 5; n++)
		{
			if (grid[m][n] == ' ')
			{
				r = m;//空格的行索引
				c = n;//空格的列索引
				break;
			}
		}
		if (r != 0 && c != 0)
		{
			break;
		}
	}
	for (i = 0; (s[i] = getchar()) != '0'; i++);//循环输入指令序列(注意开头不要输入换行)
	for (j = 0; j <= i; j++)//执行移位
	{
		if (s[j] == '0')//判断指令是否执行完毕
		{
			break;
		}
		else if (s[j] == 'A' && r != 0)//如果指令为‘A’,判断空格所在位置是否已经是上边界
		{
			swap(grid[r][c], grid[r - 1][c]);
			r = r - 1;
		}
		else if (s[j] == 'B' && r != 4)//如果指令为‘B’,判断空格所在位置是否已经是下边界
		{
			swap(grid[r][c], grid[r + 1][c]);
			r = r + 1;
		}
		else if (s[j] == 'L' && c != 0)//如果指令为‘L’,判断空格所在位置是否已经是左边界
		{
			swap(grid[r][c], grid[r][c - 1]);
			c = c - 1;
		}
		else if (s[j] == 'R' && c != 4)//如果指令为‘R’,判断空格所在位置是否已经是右边界
		{
			swap(grid[r][c], grid[r][c + 1]);
			c = c + 1;
		}
		else
		{
			cout << "This puzzle has no final configuration.";//指令不合法,输出提示,跳出循环并置islegal标记为false
			islegal = false;
			break;
		}
	}
	if (islegal == true)//如果指令合法则输出移位之后的网格
	{
		for (int m = 0; m < 5; m++)
		{
			for (int n = 0; n < 5; n++)
			{
				cout << grid[m][n] << " ";
			}
			cout << endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38758854/article/details/86746517
今日推荐