UVa 227 - Puzzle【字符串】

本文介绍了解决UVA在线评测平台上一道关于迷宫问题的算法实现过程,涉及复杂的控制逻辑和调试技巧。通过代码示例,详细阐述了如何定位空格、移动字符以及最终输出迷宫状态,提供了调试经验分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=163


比较麻烦的一道题,格式的控制真是醉了,调试了一上午才解决..............


#include<stdio.h>
#include<string.h>
int t=0,a,b,kase;
char x[6][6],s[10005];
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},dt[26];
int legal(char ch,int &a,int &b)
{
	int ta=a,tb=b,tp=dt[ch-'A'];//保留之前的位置 
	a=ta+dx[tp],b=tb+dy[tp];//操作之后的位置 
	if(a<0||a>4||b<0||b>4)//判断是否合法 
	{
		return 0;
	}
	tp=x[ta][tb];x[ta][tb]=x[a][b];x[a][b]=tp;//交换,移动 
	return 1;
}
void slove()
{
	for(int i=0;i<5;++i)//定位空格! 
	{
		for(int j=0;j<5;++j)
		{
			if(x[i][j]==' '||x[i][j]=='\0')//注意可能是空格,或者是空 
			{
				a=i;b=j;x[i][j]=' ';//记录位置 
			}
		}
	}
	for(int i=0;s[i]!='0';++i)//移动 
	{
		if(!legal(s[i],a,b))//判断是否合法 
		{
			printf("This puzzle has no final configuration.\n");//否则 
			return;
		}
	}
	for(int i=0;i<5;++i)//输出! 
	{
		for(int j=0;j<4;++j)
		{
			printf("%c ",x[i][j]);
		}
		printf("%c\n",x[i][4]);
	}
}
int main()
{
	//freopen("shuju.txt","r",stdin);
	dt['A'-'A']=0;dt['B'-'A']=1;dt['L'-'A']=2;dt['R'-'A']=3;
	while(gets(x[0]))
	{
		if(x[0][0]=='Z')//结束判断 
		{
			return 0;
		}
		for(int i=1;i<5;++i)
		{
			gets(x[i]);
		}
		int cnt=0,tp;
		while((tp=getchar())!='0')//指令数组 
		{
			if(tp!='\n')
			{
				s[cnt++]=tp;
			}
		}
		s[cnt]='0';
		getchar();//读取最后的换行 
		if(t)
		{
			printf("\n");//格式 
		}
		printf("Puzzle #%d:\n",++t);
		slove();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值