(UVA)227

来源:互联网 发布:域名cname解析过程 编辑:程序博客网 时间:2024/05/02 18:25





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


分析:这题格式需要尤其注意,以及注意非法指令的判断。


我的代码没有下面这个代码优秀,贴出一个思路非常好的代码:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const char inst[] = "ABLR";const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int main(void){    int t = 0;    char s[5][6];    char c;    while ((s[0][0] = getchar()) != 'Z') {        int bi = 0, bj = 0;        for (int i = 0; i < 5; i ++) {            for (int j = 0; j < 5; j ++) {                if (!i && !j) continue;                s[i][j] = getchar();                if (s[i][j] == ' ') {bi = i, bj = j;}            }            getchar();        }        bool legal = true;        while ((c = getchar()) != '0') {            if (legal == false || c == '\n') continue;            int k;            for (k = 0; k < 4; k ++) {                if (c == inst[k]) break;            }            if (k == 4)                legal = false;            else {                int ni = bi+dir[k][0], nj = bj+dir[k][1];                if (0 <= ni && ni < 5 && 0 <= nj && nj < 5) {                    swap(s[bi][bj], s[ni][nj]);                    bi = ni, bj = nj;                } else                    legal = false;            }        }        if (++t > 1) printf("\n");        printf("Puzzle #%d:\n", t);        if (legal == false)            printf("This puzzle has no final configuration.\n");        else {            for (int i = 0; i < 5; i ++) {                for (int j = 0; j < 5; j ++) {                    printf("%c%c", s[i][j], j == 4 ? '\n' : ' ');                }            }        }        getchar();    }    return 0;}


0 0