各位大佬都好厉害……
这个ACM/ICPC1993总决赛算黄题%%%
我个人认为至少要绿题。
虽然算法上面不是要求很大
但是操作模拟是真的恶心……
主要是输入输出的难。
对于ABLR只需要模拟即可
遇到非法指令退出
(输入输出真的很麻烦啊!!)
贴代码
#include<bits/stdc++.h> #define MAXN 5 using namespace std; char grid[MAXN][MAXN]; int blankrow, blankcol, nextrow, nextcol; int move(char move) { if(move == 'A') { nextrow = blankrow - 1; nextcol = blankcol; } else if(move == 'B') { nextrow = blankrow + 1; nextcol = blankcol; } else if(move == 'L') { nextrow = blankrow; nextcol = blankcol - 1; } else if(move == 'R') { nextrow = blankrow; nextcol = blankcol + 1; } else return 1; if(nextrow >= 0 && nextrow < MAXN && nextcol >= 0 && nextcol < MAXN) { grid[blankrow][blankcol] = grid[nextrow][nextcol]; grid[nextrow][nextcol] = ' '; blankrow = nextrow; blankcol = nextcol; return 0; } else return 1; } int main(void) { int caseno=0, okflag, i, j; char c; while((c=getchar()) != 'Z') { for(i=0; i<MAXN; i++) for(j=0; j<MAXN; j++) { grid[i][j] = c; if(c == ' ' || c == ' ') { blankrow = i; blankcol = j; grid[i][j] = ' '; } c = getchar(); if(j == MAXN-1 && c == ' ') c = getchar(); } okflag = 1; while(c != '0') { if(c != ' ') { if(move(c)){ okflag = 0; break; } } c = getchar(); if(c == ' ') c = getchar(); } while(c != '0') c = getchar(); while(c != ' ') c = getchar(); if(++caseno > 1) printf(" "); printf("Puzzle #%d: ", caseno); if(okflag) { for(i=0; i<MAXN; i++) printf("%c %c %c %c %c ", grid[i][0], grid[i][1], grid[i][2], grid[i][3], grid[i][4]); } else printf("This puzzle has no final configuration. "); } return 0; }