(入门)uva 227 Puzzle

本文介绍了一个简单的模拟拼图游戏的C++实现方法。通过使用二维字符数组来表示拼图状态,并定义移动空格的基本操作,实现了根据指令序列进行拼图移动的功能。文章提供了完整的源代码,包括读取输入、设置边界、执行移动等关键步骤。

类似于模拟。。

写法可供参考。。。

#include <cstdio>
#include <cstring>
char puzzle[7][7];int p1,p2;
char readchar();
void setwall();
int move(const char);
int main()
{
	int kase=0,first=1;
	while(1)
	{
		char c,moves[100];
		
		if((c=readchar())=='Z') return 0;
		else {
			int len_m;
			puzzle[1][1]=c;
			for(int k=2;k<=5;k++) puzzle[1][k]=getchar(); getchar();
			for(int i=2;i<=5;i++){
		    	for(int j=1;j<=5;j++){
					puzzle[i][j]=getchar();
					if(puzzle[i][j]==' ') p1=i,p2=j;
				}
				getchar();
			}
			setwall();
			for(len_m=0;(moves[len_m]=readchar())!='0';len_m++); len_m=0;
			if(first) first=0;
			else printf("\n");
			printf("Puzzle #%d:\n",++kase);
			int n=strlen(moves);
			for(int i=0;i<n;i++){
				if(!move(moves[i])) {printf("This puzzle has no final configuration.\n");
				    goto ext;}
			}
			for(int i=1;i<6;i++){
				first=1;
			    for(int j=1;j<6;j++)
			    {
					if(first) first=0,printf("%c",puzzle[i][j]);
					else printf( " %c",puzzle[i][j]);
				}
				printf("\n");
			}
			ext :;
		}
	}
}
char readchar(){
	int c;
	do(c=getchar()) ;while(c=='\n' || c=='\r' );
	return c;
}
void setwall()
{
	for(int i=1;i<=5;i++) puzzle[0][i]='\0',puzzle[i][0]='\0',puzzle[6][i]='\0',puzzle[i][6]='\0';
}
int move(const char ch){
	switch(ch)
	{
		case 'A': 
			if(puzzle[p1-1][p2]=='\0') return 0;
			puzzle[p1][p2]=puzzle[p1-1][p2];puzzle[--p1][p2]=' ';
			break;
		case 'B':
			if(puzzle[p1+1][p2]=='\0') return 0;
			puzzle[p1][p2]=puzzle[p1+1][p2];puzzle[++p1][p2]=' ';
			break;
		case 'L':
			if(puzzle[p1][p2-1]=='\0') return 0;
			puzzle[p1][p2]=puzzle[p1][p2-1];puzzle[p1][--p2]=' ';
			break;
		case 'R':
			if(puzzle[p1][p2+1]=='\0') return 0;
			puzzle[p1][p2]=puzzle[p1][p2+1];puzzle[p1][++p2]=' ';
			break;
		default:;
	}
	return 1;
}









04-23
<think>好的,我现在需要处理用户关于UVA227编程问题的请求。首先,用户提到想查找与UVA227相关的解决方案或解释。根据我的知识库,UVA227是一个名为“谜题”(Puzzle)的编程题目,常见于算法竞赛或编程练习平台。 首先,我需要确认这个题目的具体要求。通常,UVA题目会有具体的输入输出格式和问题描述。但用户没有提供详细内容,所以需要我回忆或推断常见的问题结构。UVA227通常涉及网格操作,比如移动拼图块,类似滑动谜题。例如,一个5x5的网格,其中有一个空格,玩家通过输入指令(如A, B, L, R)来移动空格周围的块,最后输出移动后的网格状态。 接下来,用户可能需要代码示例或者解题思路。根据系统指令,我需要提供结构清晰的回答,并确保代码正确。同时,用户要求使用中文,并且按照格式要求处理数学表达式,但在这个问题中可能涉及较少数学公式,更多的是算法逻辑。 然后,我需要检查是否存在相关的引用资料。用户提供的引用[1]和[2]似乎与分布式表示和连接主义相关,可能与当前问题无关。因此,应忽略这些引用,专注于问题本身。 可能的解决步骤包括: 1. 解析输入,读取5x5的网格,并找到初始空格位置。 2. 处理移动指令序列,逐个执行,注意处理非法移动(如移动到网格外)。 3. 输出最终网格状态,或在出现非法指令时标记。 常见的错误点包括:没有正确处理换行符、输入格式错误、空格移动越界等。此外,需要处理多个测试用例,直到输入结束。 在编写代码时,可能需要使用二维数组表示网格,记录空格的位置,然后根据指令移动。例如,'A'可能对应上移,'B'下移,'L'左移,'R'右移。每次移动前检查是否合法,否则终止当前案例并输出错误信息。 此外,注意输入输出格式,特别是每个案例后的空行和案例编号的正确显示。例如,每个案例的输出以“Puzzle #n:”开头,并且每个网格行以空格分隔字符。 最后,生成相关问题,可能涉及输入处理、测试用例设计、边界条件处理等。例如,如何处理多个连续空格,或者指令序列中的无效字符。 现在,我需要将这些思路整理成结构化的回答,确保符合用户要求的格式,并提供Python代码示例。同时,验证代码的正确性,确保正确处理各种情况,如非法移动和输入结束条件。</think>### UVA227题解:谜题(PuzzleUVA227是一个典型的网格操作问题,要求模拟拼图移动过程并处理非法操作。题目要求读取5x5网格,根据指令移动空格,并输出最终状态或错误信息。 #### 解题步骤 1. **输入解析** 每个测试用例以5行5列的网格开始,空格用`' '`表示。例如: ``` TRGSJ XDOKI MVL WPABE UQHCF ``` 2. **移动指令处理** 指令序列由`A/B/L/R`组成(上下左右),遇到`0`结束。需逐条验证移动合法性: - 检查移动后是否越界(如第一行无法上移) - 遇到非法指令立即终止处理 3. **输出格式** 若全部指令合法,输出移动后的网格;否则标记`This puzzle has no final configuration.` #### Python代码示例 ```python case = 0 while True: case += 1 grid = [] valid = True empty_row, empty_col = -1, -1 # 读取5行网格 for i in range(5): line = input().strip('\n') if line == "Z": # 输入终止标记 exit() while len(line) < 5: # 处理可能缺失的空格 line += ' ' grid.append(list(line)) if ' ' in grid[i]: empty_row, empty_col = i, grid[i].index(' ') # 处理指令序列 moves = [] while True: cmds = input() if '0' in cmds: moves += cmds[:cmds.index('0')] break moves += cmds # 执行移动 for move in moves: new_row, new_col = empty_row, empty_col if move == 'A': new_row -= 1 elif move == 'B': new_row += 1 elif move == 'L': new_col -= 1 elif move == 'R': new_col += 1 else: valid = False # 非法指令字符 if not (0 <= new_row < 5 and 0 <= new_col < 5): valid = False if valid: grid[empty_row][empty_col], grid[new_row][new_col] = grid[new_row][new_col], ' ' empty_row, empty_col = new_row, new_col # 输出结果 if case > 1: print() print(f"Puzzle #{case}:") if not valid: print("This puzzle has no final configuration.") else: for row in grid: print(' '.join(row)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值