uva 227 Puzzle (UVA - 227)

感慨

这个题实在是一个大水题(虽然说是世界决赛真题),但是它给出的输入输出数据,标示着老子世界决赛真题虽然题目很水但是数据就能卡死你。。。一直pe pe直到今天上午AC。。。无比感慨。。。就是因为最后一行不能空行。

题目大意

这个题目说的是有这么一个55的正方形里面有24个小正方形和一个空,然后这个游戏本来的意思是要通过移动把所有的正方形(每一个都印着一个字母)按照字母表的顺序排列好,但是这个题它放水了,没有让你去找怎么移动,而是仅仅给你一些指令去看看这些指令过后这个55的版是什么样子。。。emmm这不就很简单了,如果你这么想那就错了首先它的输入数据就会卡人。

分析卡人的地方

①输入数据是一连串连续的字符,而中间的空不用@,不用#,就用空格。空格啊,我去让我第一次输入的时候就没发现而被坑到了。空格意味着什么?意味着scaanf和cin的扑街。

②然后它输入的指令是无限多的然后到0结束,嗯这个还比较容易但是居然指令中间还会有空行啊我去。。。可能指令就有多行,空行意味着什么?意味着getline也扑街了。

③好在我们还有c=getchar()的while循环,但是输出数据还有第一个常规坑就是字母最后不能有多余的空格,这个很好理解啊,一般的题也可能有。

④到了最后就是最坑的了,就是输出的最后一行不能有空行。关键输出结束看的是Z啊,我怎么知道什么时候输出Z?

解决最后输出Z的时候上一个结果不能有多余空行的问题

我直到今天上午才想明白这个东西,只要在Z的后面加一个if(num>0) 然后回车就行了,然后把下面的每个结果再空行的都删掉就ok了。

题目解法

实在没什么好说的这个题自己写一个swap然后按照意思swap就行了,注意要加一个判定如果出界那么就是无结果。我这个判定写在了一个函数里面

我的代码(vj 20ms)

#include <iostream>
#include <cstring>
using namespace std;
int f;
char order[10000];
char orderplus[10000];
string map[5];
void swap(char &a,char &b)
{
    char c;
    c=a;
    a=b;
    b=c;
}
bool exc(int a,int b)
{
    if(a<0||b<0||a>=5||b>=5)
    {
        f=1;
        return true;
    }
    else
    return false;
}
main()
{
    int num=0;
    while(1)
    {
        memset(order,0,sizeof(order));
        f=0;
        int x,y;
        for(int i=0;i<5;i++)
        {
            getline(cin,map[i]);
            if(map[0][0]==‘Z‘)
            return 0;
        }
        if(num>0)
        cout<<endl;
        for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
        if(map[i][j]==‘ ‘)
        {
            x=i;y=j;
        }
        int p=0;
        char now;
        while((now=getchar())!=‘0‘)
        order[p++]=now;
        cin.get();
        for(int i=0;i<p;i++)
        {
            if(order[i]==‘A‘)
            {
                if(exc(x-1,y))
                break;
                swap(map[x-1][y],map[x][y]);
                x=x-1;y=y;
            }
            else if(order[i]==‘R‘)
            {
                if(exc(x,y+1))
                break;
                swap(map[x][y+1],map[x][y]);
                x=x;y=y+1;
            }
            else if(order[i]==‘B‘)
            {
                if(exc(x+1,y))
                break;
                swap(map[x+1][y],map[x][y]);
                x=x+1;y=y;
            }
            else if(order[i]==‘L‘)
            {
                if(exc(x,y-1))
                break;
                swap(map[x][y-1],map[x][y]);
                x=x;y=y-1;
            }
        }
        printf("Puzzle #%d:\n",++num);
        if(f)
        cout<<"This puzzle has no final configuration.\n";
        else
        {
            for(int i=0;i<5;i++)
            {
                for(int j=0;j<5;j++)
                {
                    cout<<map[i][j];
                    if(j<4)
                    cout<<" ";
                }
                cout<<endl;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/baccano-acmer/p/9742031.html

时间: 2024-10-03 23:39:09

uva 227 Puzzle (UVA - 227)的相关文章

uva 1399 - Puzzle(AC自动机)

题目链接:uva 1399 - Puzzle 题目大意:给定K和N,表示有K种不同的字符,N个禁止串,求一个最长的串使得该串不包含任何禁止串为子串.如果存在循环或者不能构成的话,输出No. 解题思路:建立AC自动机,然后在AC自动机上做dp,所有单词结尾节点为禁止点. #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std;

UVA 1399 - Puzzle(AC自动机+DP)

UVA 1399 - Puzzle 题目链接 题意:给定一些字符串,求一个最长的不在包含这些子串的字符串,如果可以无限长输出No 思路:建ACM自动机,把不可走结点标记构造出来,然后在这个状态图上进行dp找出最长路径即可,至于无限长的情况,只要在dp前进行一次dfs判有没有环即可 代码: #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include &

UVa - 227 - Puzzle

给空格子上下左右的互换操作,问最后是怎样的 注意一行的最后一个若是空格,需要自己加注意读取时 操作可能分好多行,一定要读取到 0 为止 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char map[50][50],op[1000],c,tmp; 5 int k,t,x,y,cnt; 6 bool flag; 7 void fuc() 8 { 9 flag=1; 10 for(int i=0;

UVA 227 Puzzle - 输入输出

题目: acm.hust.edu.cn/vjudge/roblem/viewProblem.action?id=19191 这道题本身难度不大,但输入输出时需要特别小心,一不留神就会出问题. 对于输入,如果要读入一行时: 没有空白字符,则直接使用scanf和%s即可: 有空白字符,使用gets,但要小心溢出:fgets一直不能正常工作,有待研究(gets会将缓冲区多余的\n扔掉,fgets会保留在字符串中): 对于要读入单个字符时: 使用scanf和“ %c”进行舍弃空白字符(注意空格),并且最

Puzzle UVA - 227

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

UVA 227 Puzzle(基础字符串处理)

题目链接: https://cn.vjudge.net/problem/UVA-227 1 /* 2 问题 输入一个5*5的方格,其中有一些字母填充,还有一个空白位置,输入一连串 3 的指令,如果指令合法,能够得到一个移动后的方格就输出方格,不能就输出 4 "This puzzle has no final configuration." 5 6 解题思路 7 模拟,一个一个的读入字符,包括空格,再读入若干行指令,如果指令表面合法,进入模拟看内容是否合法,不合法直接输出提示. 8 9

习题3-5 Puzzle UVA - 227

这题太能卡人了,都是输入输出卡的. 1.输入的5X5矩阵中,有时一行最后有多个空格和回车 2.输出格式中,每两个输出结果之间间隔一个空行,但是最后一个结果之后没有空行. 3.有时到第四位元素,直接不按空格,直接换行了. 其实思路很简单,先判断是否运动越界,如果是的话就输出无答案,如果没越界,就依次将空格和目标位置元素相互交换. 下面是AC代码,就是把这些小BUG修修补补改出来的,抛砖引玉吧. #include <bits/stdc++.h> #define N 7 #define M_N 10

UVa 1399 Puzzle

方法:AC自动机 先把禁止的string插入ac自动机中,然后再这个自动机上求最长的合法路径.如果出现环或者最长路径长度为0,则输出"No":否则输出最长路径. code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include <vector&

uva 1586 分子量 uva 1584 字典序最小

1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<iostream> 5 #include<algorithm> 6 #include<map> 7 8 using namespace std; 9 10 int N; 11 12 map <char,double> ar; 13 14 int main(){ 15 ar['C'] =