有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指
令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指
令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This
puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示。
写的比较简陋,先写了容器,然后填充,写移动条件。
以下是用C写的源码:
#include<stdio.h> #include<string.h> int main() { char net[7][7],c=65,ch;int i,j; memset(net,32,sizeof net); for(i=1;i<6;i++) for(j=1;j<6;j++) net[i][j]=(c++); net[5][5]=42; int x=5,y=5,temp; do{ while((c=getchar())!=EOF&&(c==65||c==66||c==76||c==82)) { if(x>0&&x<7&&y<7&&y-1>0&&c==65) {temp=net[y][x];net[y][x]=net[y-1][x];net[y-1][x]=temp;y--;} if(x>0&&x<7&&y>0&&y+1<7&&c==66) {temp=net[y][x];net[y][x]=net[y+1][x];net[y+1][x]=temp;y++;} if(x-1>0&&x<7&&y>0&&y<7&&c==76) {temp=net[y][x];net[y][x]=net[y][x-1];net[y][x-1]=temp;x--;} if(x>0&&x+1<7&&y>0&&y<7&&c==82) {temp=net[y][x];net[y][x]=net[y][x+1];net[y][x+1]=temp;x++;} } if(c!=65&&c!=66&&c!=76&&c!=82) printf("The puzzle has no final configuration.\n"); for(i=0;i<7;i++) {for(j=0;j<7;j++) printf("%c",net[i][j]);printf("\n");} }while(c!=‘q‘); return 0; } ~ ~ ~
本文出自 “9938713” 博客,请务必保留此出处http://9948713.blog.51cto.com/9938713/1696943
Puzzle, ACM/ICPC World Finals 1993, UVa227
原文地址:http://9948713.blog.51cto.com/9938713/1696943