一. 题目链接:
Puzzle UVA-227
二.题目大意:
有一个 5 × 5 的字母矩阵,其中有一个是空格。
共有 4 中指令,分别为 A, B, L, R.
A:将空格上的相邻字母移到空格中.
B:将空格下的相邻字母移到空格中.
L:将空格左的相邻字母移到空格中.
R:将空格右的相邻字母移到空格中.
输入指令后 若有非法指令输出“This puzzle has no final configuration.” 否则输出执行指令后的网格.
三.分析:
水题!
难就难在 输入 和 输出格式上.
还是太菜了.
四.代码实现:
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <ctime>
#include <stack>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
#define eps 0.000001
#define PI acos(-1.0)
#define ll long long int
using namespace std;
int main()
{
char ch;
int i, j;
int tot = 0;
string mp[10];
while(getline(cin, mp[0]) && mp[0][0] != 'Z')
{
bool flag = 1;
int x = -1;
int y = -1;
for(i = 1; i < 5; ++i)
getline(cin, mp[i]);
for(i = 0; i < 5; ++i)
{
for(j = 0; j < 5; ++j)
{
///这里注意,如果空格在最后,好像没有输入,所以说用 '\0' 来记录行末的空格.
if(mp[i][j] == ' ' || mp[i][j] == '\0')
{
x = j;
y = i;
}
}
}
while((ch = getchar()) != '0')
{
if(flag)
{
if(ch == 'A')
{
if(y == 0)
flag = 0;
else
{
swap(mp[y - 1][x], mp[y][x]);
y--;
}
}
else if(ch == 'B')
{
if(y == 4)
flag = 0;
else
{
swap(mp[y + 1][x], mp[y][x]);
y++;
}
}
else if(ch == 'L')
{
if(x == 0)
flag = 0;
else
{
swap(mp[y][x - 1], mp[y][x]);
x--;
}
}
else if(ch == 'R')
{
if(x == 4)
flag = 0;
else
{
swap(mp[y][x + 1], mp[y][x]);
x++;
}
}
}
}
if(tot)
printf("\n");///这里的格式。。。没仔细读题
printf("Puzzle #%d:\n", ++tot);
if(flag)
{
for(i = 0; i < 5; ++i)
{
for(j = 0; j < 5; ++j)
{
if(j)
printf(" ");
cout << mp[i][j];
}
printf("\n");
}
}
else
printf("This puzzle has no final configuration.\n");
getchar();///这里注意下
}
return 0;
}
这个题难就难在输入上,还有一些小细节要注意!