【UVA】227 Puzzle

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

目录

题目:

Input

Output

Sample Input

Sample Output

分析:

代码:


 

题目:

(题目中还带有示例图,详情可点击题目链接看原题。)

 A children’s puzzle that was popular 30 years ago consisted of a 5×5 frame which contained 24 small squares of equal size. A unique letter of the alphabet was printed on each small square. Since there were only 24 squares within the frame, the frame also contained an empty position which was the same size as a small square. A square could be moved into that empty position if it were immediately to the right, to the left, above, or below the empty position. The object of the puzzle was to slide squares into the empty position so that the frame displayed the letters in alphabetical order.

The illustration below represents a puzzle in its original configuration and in its configuration after the following sequence of 6 moves:

1) The square above the empty position moves.

2) The square to the right of the empty position moves.

3) The square to the right of the empty position moves.

4) The square below the empty position moves.

5) The square below the empty position moves.

6) The square to the left of the empty position moves.

Write a program to display resulting frames given their initial configurations and sequences of moves.

Input

Input for your program consists of several puzzles. Each is described by its initial configuration and the sequence of moves on the puzzle. The first 5 lines of each puzzle description are the starting configuration. Subsequent lines give the sequence of moves.

The first line of the frame display corresponds to the top line of squares in the puzzle. The other lines follow in order. The empty position in a frame is indicated by a blank. Each display line contains exactly 5 characters, beginning with the character on the leftmost square (or a blank if the leftmost square is actually the empty frame position). The display lines will correspond to a legitimate puzzle.

The sequence of moves is represented by a sequence of As, Bs, Rs, and Ls to denote which square moves into the empty position. A denotes that the square above the empty position moves; B denotes that the square below the empty position moves; L denotes that the square to the left of the empty position moves; R denotes that the square to the right of the empty position moves. It is possible that there is an illegal move, even when it is represented by one of the 4 move characters. If an illegal move occurs, the puzzle is considered to have no final configuration. This sequence of moves may be spread over several lines, but it always ends in the digit 0. The end of data is denoted by the character Z.

Output

Output for each puzzle begins with an appropriately labeled number (Puzzle #1, Puzzle #2, etc.). If the puzzle has no final configuration, then a message to that effect should follow. Otherwise that final configuration should be displayed. Format each line for a final configuration so that there is a single blank character between two adjacent letters. Treat the empty square the same as a letter. For example, if the blank is an interior position, then it will appear as a sequence of 3 blanks — one to separate it from the square to the left, one for the empty position itself, and one to separate it from the square to the right. Separate output from different puzzle records by one blank line. Note: The first record of the sample input corresponds to the puzzle illustrated above.

Sample Input

TRGSJ

XDOKI

M VLN

WPABE

UQHCF

ARRBBL0

ABCDE

FGHIJ

KLMNO

PQRS  

TUVWX

AAA

LLLL0

ABCDE

FGHIJ

KLMNO

PQRS 

TUVWX

AAAAABBRRRLL0

Z

Sample Output

Puzzle #1:
T R G S J
X O K L I
M D V B N
W P   A E
U Q H C F

Puzzle #2:
  A B C D
F G H I E
K L M N J
P Q R S O
T U V W X

Puzzle #3:

This puzzle has no final configuration.

分析:

这道题主要意思是,有5x5的方阵,其中含24个字母和一个空,然后通过A、B、L、R(分别对应上下左右)的指令,移动空格附近相应位置的字符到空格处(这就等同于,相应格的字母与空格交换位置)。 如命令A则移动空格上方的字母 到空格处。如果命令无效(移动无效,不能再按照指定命令移动),则输出“This puzzle has no final configuration.”。

因为5x5中有空格,所以输入时,不能使用scanf("%s",s[i]);这样,所以我采用了for循环一位位输入,每输入5个(一行),就getchar()获取一个'\n'。同时判断空格所在位置,以及是否为最终程序终止指令“Z”。然后一位位getchar,获取移动指令。

另外,注意格式。输出要求每个格间含一个空格。而且两组数据间含一个空行。还有处理输入时的'\n'也着实令人头疼,首先输入五个一行的元素,如果通过getchar,就需要额外获取'\n'(也可用gets函数专门获取一行的内容,不过已有的新c标准早已去掉了gets函数,不过编译器等大多还能用);然后,输入移动指令中,也需要获取'\n'直接continue;还有最后,输完移动指令,还需要getchar获取输入0后的'\n'。

代码:

#include <stdio.h>
int main()
{
	char s[5][5];
	char c;
	int i,j,a,b,isfinal;
	int kase=0;
	while (1)
	{
		a=-1;b=-1;
		for (i=0;i<5;i++)
		{	
			for (j=0;j<5;j++)
			{
				s[i][j]=getchar();
				if (s[0][0]=='Z')return 0;
				else if (s[i][j]==' ') { a=i; b=j;}	//找到空格坐标
				//printf("**S[%d][%d]=%c\n",i,j,s[i][j]);
			}
			getchar();
		}
		isfinal=1;
		while ((c=getchar()) != '0')
		{
			if (c == '\n')continue;
			//printf("c=%c,i=%d,j=%d\n",c,a,b);
			if (c == 'A' && a>0)
			{
				s[a][b]=s[a-1][b];
				a--;
				s[a][b]=' ';
			}
			else if (c == 'B' && a<4)
			{
				s[a][b]=s[a+1][b];
				a++;
				s[a][b]=' ';
			}
			else if (c == 'L' && b>0)
			{
				s[a][b]=s[a][b-1];
				b--;
				s[a][b]=' ';
			}
			else if (c == 'R' && b<4)
			{
				s[a][b]=s[a][b+1];
				b++;
				s[a][b]=' ';
			}
			else
			{
				isfinal=0;
			}
		}
		getchar();//获取键入0后的'\n'
		if (kase)printf("\n");
		printf("Puzzle #%d:\n",++kase);
		if (isfinal) 
		{
			for (i=0; i<5; i++)
				printf("%c %c %c %c %c\n",s[i][0],s[i][1],s[i][2],s[i][3],s[i][4]);
		}
		else printf("This puzzle has no final configuration.\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单词搜索迷宫(Word Search Puzzle)问题是一个经典的算法问题,其输入是一个二维的字符数组和一组单词,目标是找出字符数组网格中的所有单词。这些单词可以是水平的、垂直的或者是任意的对角线方向,所以需要查找8个不同的方向。解决这个问题的一种常见方法是使用回溯算法,具体步骤如下: 1. 遍历二维字符数组,对于每个字符,以其为起点开始搜索,搜索的方向包括水平、垂直和对角线方向。 2. 对于每个搜索到的单词,将其记录下来。 3. 重复步骤1和2,直到遍历完整个二维字符数组。 下面是一个使用C#语言实现的单词搜索迷宫算法的示例代码: ```csharp class WordSearchPuzzle { private char[,] grid; private HashSet<string> words; public WordSearchPuzzle(char[,] grid, HashSet<string> words) { this.grid = grid; this.words = words; } public void Solve() { int rows = grid.GetLength(0); int cols = grid.GetLength(1); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { Search(i, j, new StringBuilder()); } } } private void Search(int row, int col, StringBuilder sb) { if (row < 0 || row >= grid.GetLength(0) || col < 0 || col >= grid.GetLength(1)) { return; } sb.Append(grid[row, col]); string word = sb.ToString(); if (words.Contains(word)) { Console.WriteLine("Found '{0}' at [{1}, {2}] to [{3}, {4}]", word, row, col, row - sb.Length + 1, col - sb.Length + 1); } if (word.Length < 3) { Search(row + 1, col, sb); Search(row - 1, col, sb); Search(row, col + 1, sb); Search(row, col - 1, sb); Search(row + 1, col + 1, sb); Search(row - 1, col - 1, sb); Search(row + 1, col - 1, sb); Search(row - 1, col + 1, sb); } sb.Remove(sb.Length - 1, 1); } } // 使用示例 char[,] grid = new char[,] { {'t', 'h', 'i', 's'}, {'w', 'a', 't', 's'}, {'o', 'a', 'h', 'g'}, {'f', 'g', 'd', 't'} }; HashSet<string> words = new HashSet<string>() { "this", "two", "fat", "that" }; WordSearchPuzzle puzzle = new WordSearchPuzzle(grid, words); puzzle.Solve(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值