习题3-5 谜题【UVa 227】

本文深入解析了UVA227谜题的算法解决方案,重点介绍了如何处理复杂的输入和输出格式,特别是对于网格矩阵中空格的处理,以及如何通过模拟操作验证解的正确性。

题目链接

Puzzle - UVA 227

题目分析

这道题目主要复杂度在输入和输出的处理,主要是输入的网格矩阵有空格,所以要用getchar()来进行输入,但是输入的时候又要考虑换行和最后一组输入的情况,输入指令序列也是同样的情况,可能有空白字符。模拟的时候注意数组边界即可。

源代码

#include<stdio.h>
#include<string.h>
int main() {
	char p[5][5];
	char ins[1005];
	char ch;
	int x,y,ilen,kase=1;
	while(true) {
		bool q=false; //输入终止标志,遇到一个开头单Z 
		for(int i=0;i<25;i++) {
			ch=getchar();	
			if(ch=='\n') {
				i--;
				continue;
			}
			if(i==0&ch=='Z') {
				q=true;
				break;	
			}
			if(ch==' ') {
				x=i/5;
				y=i%5;
			}
			p[i/5][i%5]=ch;
		}
		if(q) break;
		ilen=0;
		while(true) {
			ch=getchar();
			if(ch=='\n'||ch==' ') continue;
			if(ch=='0') break;
			ins[ilen++]=ch;
		}
		ins[ilen]='\0';
		q=true; //是否有解标志
		for(int i=0;i<ilen;i++) {
			if(ins[i]=='L') {
				if(y==0) {
					q=false;
					break;
				} else {
					ch=p[x][y];
					p[x][y]=p[x][y-1];
					p[x][y-1]=ch;
					y--;
				}
			} else if(ins[i]=='R') {
				if(y==4) {
					q=false;
					break;
				} else {
					ch=p[x][y];
					p[x][y]=p[x][y+1];
					p[x][y+1]=ch;
					y++;
				}
			} else if(ins[i]=='A') {
				if(x==0) {
					q=false;
					break;
				} else {
					ch=p[x][y];
					p[x][y]=p[x-1][y];
					p[x-1][y]=ch;
					x--;
				}
			} else if(ins[i]=='B') {
				if(x==4) {
					q=false;
					break;
				} else {
					ch=p[x][y];
					p[x][y]=p[x+1][y];
					p[x+1][y]=ch;
					x++;
				}
			}
		}
		if(kase==1) printf("Puzzle #%d:\n",kase++);
		else printf("\nPuzzle #%d:\n",kase++);
		if(!q) printf("This puzzle has no final configuration.\n");
		else {
			for(int i=0;i<5;i++){
				for(int j=0;j<4;j++) {
					printf("%c ",p[i][j]);
				}
				printf("%c\n",p[i][4]);
			}
		}
	}
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值