1. 程式人生 > >習題3-5 謎題(Puzzle, ACM/ICPC World Finals 1993, UVa227)

習題3-5 謎題(Puzzle, ACM/ICPC World Finals 1993, UVa227)

30年前流行的兒童拼圖由一個5×5的框架組成,其中包含24個
相同大小的方塊。每個小廣場上都印有一個獨特的字母。由於
框架內只有24個正方形,因此框架還包含一個與
小正方形大小相同的空位置如果正方形位於空位置的
右側,左側,上方或下方,則可以將方形移動到該空位置。拼圖的目的是將方塊滑動
到空位置,以便框架按字母順序顯示字母。
下圖顯示了原始配置中的一個謎題,以及在
以下6個移動序列之後配置
1)空位置上方的方塊移動。
2)空位右側的方格移動。
3)空位右側的方格移動。
4)空位下方的方塊移動。
5)空位下方的方塊移動。
6)空位左側的方格移動。


根據初始配置和移動順序編寫程式以顯示結果幀。您的程式的
輸入
輸入包含幾個謎題。

每個都由它的初始配置和
拼圖上的移動順序來描述每個拼圖描述的前5行是起始
配置。後續行給出了移動序列。
框架顯示的第一行對應於拼圖中的頂部正方形線。其他
行按順序排列。框架中的空位置由空白表示。每個顯示行包含
5個字元,從最左邊的正方形上的字元開始(如果最左邊的話,則為空白)
square實際上是空框架位置)。顯示行將對應於合法的拼圖。
移動序列由As,Bs,Rs和Ls的序列表示,以表示哪個方塊
移動到空位置。A表示空位置上方的方格移動; B表示
空位下方的平方移動; L表示空位左邊的方格
移動; R表示空位置右側的平方移動。
即使由4個移動字元中的一個表示,也可能存在非法移動。如果發生非法移動
,則認為該謎題沒有最終配置。
可以傳播這一系列的動作

在幾行中,它總是以數字0結束。資料的結尾用字元Z表示。每個拼圖的
輸出
輸出以適當標記的數字開始(拼圖#1,拼圖#2等)。如果
拼圖沒有最終配置,那麼應該遵循相應的訊息。否則
應顯示最終配置。
格式化每一行以進行最終配置,以便在兩個
相鄰字母之間存在單個空白字元將空方塊視為字母。例如,如果空白是一個內部
位置,那麼它將顯示為一個3個空白的序列 - 一個用於將它與正方形分開到左邊,
一個用於空位置本身,一個用於將其與正方形分隔為對。
通過一個空行將不同拼圖記錄的輸出分開。
注意:示例輸入的第一條記錄對應於上面說明的拼圖。
樣本輸入
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0

ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z
樣本輸出
拼圖#1:
TRGSJ
XOKLI
MDVBN
WPAE
UQHCF
拼圖#2:
ABCD
FGHIE
KLMNJ
PQRSO
TUVWX
拼圖#3:
這個拼圖沒有最終配置。

#include<stdio.h>
#include<string.h>
#include<iostream>
#define maxn 5
const int dir[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
const char s[] ="ABRL";
using namespace std;
int main()
{
    char a[maxn][maxn];
    int count=0;
    while(gets(a[0]))
    {
        int x=0,y=0;
        if(a[0][0]=='Z')
            break;
        if(count)
        {
            cout<<endl;
        }
        for(int i=1;i<maxn;i++)
        {
            gets(a[i]);
        }

        for(int i=0;i<maxn;i++)
        {
            for(int j=0;j<maxn;j++)
            {
//                a[i][j]=getchar();
                if(a[i][j]==' '||a[i][j]=='\0')
                {
                    a[i][j]=' ';
                    x=i;
                    y=j;
                }
            }
        }
        bool bo = true;
        for(;;)
        {
            char c=getchar();
            if(c=='0')
            {
                break;
            }
            bool q = isspace(c);
            for(int i=0;i<4&&bo;i++)
            {
                if(c==s[i])
                {
                    q=true;
                    //int m=x,n=y;
                    int m=x+dir[i][0];
                    int n=y+dir[i][1];
                    if(x<0||x>4||y<0||y>4)
                    {
                        bo=false;
                        break;
                    }
                    a[x][y]=a[m][n];
                    a[m][n]=' ';
                    x=m;
                    y=n;
                }
            }
            if(!q)
            {
                bo = false;
            }
        }
        printf("Puzzle #%d\n",++count);
        if(bo)
        {
            for(int i=0;i<maxn;i++)
            {
                for(int j=0;j<maxn;j++)
                {
                    if(j)
                    {
                        cout<<" ";
                    }
                    cout<<a[i][j];
                }
                cout<<endl;
            }
        }
        else
        {
            cout<<"This puzzle has no final configuration."<<endl;
        }
    }
    return 0;

}

相關推薦

習題3-5 Puzzle, ACM/ICPC World Finals 1993, UVa227

30年前流行的兒童拼圖由一個5×5的框架組成,其中包含24個相同大小的小方塊。每個小廣場上都印有一個獨特的字母。由於框架內只有24個正方形,因此框架還包含一個與小正方形大小相同的空位置。如果正方形位於空位置的右側,左側,上方或下方,則可以將方形移動到該空位置。拼圖的目的是將方

Puzzle, ACM/ICPC World Finals 1993, UVa227難死了!!

有一個5*5的網格,其中恰好有一個格子是空的,其他格子各有一個字母。一共有4種指令:A, B, L, R,分別表示把空格上、下、左、右的相鄰字母移到空格中。輸入初始網格和指令序列(以數字0結束),輸出指令執行完畢後的網格。如果有非法指令,應輸出“This puz

習題4-2 正方形 Squares, ACM/ICPC World Finals 1990, UVa201

廢了半天勁,終於ac了. 總結了一點uva上的注意事項 1.不能有package ; 2.類 : public class Xiangqi 要改成public class Main 3.import javax.swing.*; // 請勿使用 4.對於輸入內容,沒有明

蹤電子表格中的單元格Spreadsheet Tracking, ACM/ICPC World Finals 1997, UVa512

rac += ron 9.png 前插 for 插入行 family define 有一個r行c列(1≤r,c≤50)的電子表格,行從上到下編號為1~r,列從左到右編號為1 ~c。如圖4-2(a)所示,如果先刪除第1、5行,然後刪除第3, 6, 7, 9列,結果

演算法競賽入門經典(第二版) 習題3-5 Puzzle UVa227 Finals1993

Page 57 Description 一個5*5的網格中恰好有一個格子是空的,其他格子各有一個字母,四條指令A,B,L,R分別表示將空格上、下、左、右移動。輸入初始網格(以Z結束)和一串指令(以0結束),輸出執行操作後的網格。越界則輸出“This puzzle has n

演算法競賽入門經典第2版習題3-5 Puzzle) Uva227

C++編寫 #include<iostream> using namespace std; int main() { int x = 2, y = 1; char Pu

習題3-9 子序列All in All, UVa 10340

輸入兩個字串s和t,判斷是否可以從t中刪除0個或多個字元(其他字元順序不變),得到字串s。例如,abcde可以得到bce,但無法得到dc。提示:t是較長的那個序列,s是要得到的那個序列,思路就是先把“指

A - Multiplication Dilemma (思維) 2018 ACM ICPC Arabella Collegiate Programming Contest

滴答滴答---題目連結  Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your mind, but it is eas

Multiplication Dilemma (思維) 2018 ACM ICPC Arabella Collegiate Programming Contest

Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your mind, but it is easier to find the

UVa 227 Puzzle習題3-5

這題用了不少的時間,反正就是模擬吧,最主要的地方就是字串獲取以及一些細節的地方,有的地方一不注意就會出問題 #include<cstdio> #include<cstring> #include<iostream> using namespace st

演算法入門 習題3-5

​ #include <stdio.h> #include<iostream> #include<cmath> #include <string.h> u

習題3.11 表達式轉換25 分浙大版《數據結構第2版》題目集

lang == lan 包括 設計程序 不用 運算 出現 加減 算術表達式有前綴表示法、中綴表示法和後綴表示法等形式。日常使用的算術表達式是采用中綴表示法,即二元運算符位於兩個運算數中間。請設計程序將中綴表達式轉換為後綴表達式。 輸入格式: 輸入在一行中給出不含

APM-3.5.2-EKF2筆記未完待續

20180704: 一、EKF2.InitialiseFilter()全過程 1. 記錄開始時間,預期步長時間(_frameTimeUsec = 2500),每次融合讀取IMU次數(_framesPerPrediction = 4),確定是否記日誌(通過引數,預設不記錄) 2. 根據加速度計數量確定

3章 SQL 習題 - 3.5

假設有關係marks(ID,score),我們希望基於如下標準為學生評定等級:如果score < 40 得F;如果40<=score<60得C;如果60<=score<80得B;如果80<=score得A。寫出SQL查詢完成下列操作: 為了學生操作,首先建立關

西瓜數 課後習題3.5 線性判別分析

import csv import numpy as np import matplotlib.pyplot as plt def readData(filename): """ 讀取資料 :param filename: csv格式資料集 :return: X:

習題3-5 三角形判斷

給定平面上任意三個點的座標(x​1​​,y​1​​)、(x​2​​,y​2​​)、(x​3​​,y​3​​),檢驗它們能否構成三角形。 輸入格式: 輸入在一行中順序給出六個[−100,100]範圍內的數字,即三個點的座標x​1​​、y​1​​、x​2​​、y​2​​、x​

演算法競賽入門經典 習題2-5 分數化小數decimal

                                           分數化小數(decimal) 輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位。a,b≤106,c≤

CCF CSP考試題 2018-3 1、2跳一跳、碰撞

第一題 跳一跳 試題編號:201803-1 試題名稱:跳一跳 時間限制:1.0s 記憶體限制:256.0MB 問題描述 問題描述        近來,跳一跳這款小遊戲風靡全國,受到不少玩家的喜愛。

演算法競賽入門經典習題3-5

題目描述:輸入一個n*n字元矩陣,把它左轉90°後輸出。 這個題目就是一個簡單地下標的轉換 程式碼如下: #include <iostream> #include <cstring> #include <cctype>

習題7-5 找鞍點 20 point(s)

習題7-5 找鞍點 (20 point(s)) 一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。 本題要求編寫程式,求一個給定的n階方陣的鞍點。 輸入格式: 輸入第一行給出一個正整數n(1≤n≤6)。隨後n行,每行給出n個整數,其間以空格分隔。 輸出格式: