uva 227--模拟

点击打开链接

这是一道字符串模拟题,可以用来锻炼代码能力吧。

题意很简单给定一个5*5的迷宫,其中有一个空格,每次操作都是让空格进行移动,输出一系列操作之后的迷宫。

代码:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#define from(i,a,n)   for(int i=a;i<n;i++)
#define refrom(i,n,a) for(int i=n;i>=a;i--)
#define EPS 1e-10
#define mod 1000000007
using namespace std;

const double INF=0x3f3f3f3f;
const int MAX =8;
char puzzle[MAX][MAX];

int main()
{
    int t=0;
    while(gets(puzzle[0]))
    {
        int x,y;
        if(puzzle[0][0]=='Z') break;
        from(i,1,5)
        gets(puzzle[i]);
        from(i,0,5)
        from(j,0,5)
        if(puzzle[i][j]==' ')
        {
            x=i;
            y=j;
        }//找到空格的位置
        char c;
        bool flag=false;//标记变量,用于判断是否越界
        while((c=getchar())!='0')
        {
            if(flag) continue;//如果已经越界,则不用继续操作
            if(c=='R')
            {
                if(y+1>=5) flag=true;//越界进行标记,否则交换两个字符的位置
                else swap(puzzle[x][y],puzzle[x][y+1]);
                y++;//空格坐标相应的改变
            }
            if(c=='L')
            {
                if(y-1<0) flag=true;
                else swap(puzzle[x][y],puzzle[x][y-1]);
                y--;
            }
            if(c=='B')
            {
                if(x+1>=5) flag=true;
                else swap(puzzle[x][y],puzzle[x+1][y]);
                x++;
            }
            if(c=='A')
            {
                if(x-1<0) flag=true;
                else swap(puzzle[x][y],puzzle[x-1][y]);
                x--;
            }
            /*cout<<c<<endl;
            from(i,0,5)
            from(j,0,5)
            {
            if(j!=4) printf("%c ",puzzle[i][j]);
            else printf("%c\n",puzzle[i][j]);
            }
            cout<<endl;*/
        }
        getchar();//这个很重要,拿掉操作后面的回车,否则影响下一个数据的结果
        if(t) printf("\n");//除第一个数据,后面每个数据与前一个数据之间有几个空格
        printf("Puzzle #%d:\n",++t);
        if(flag) printf("This puzzle has no final configuration.\n");
        else
        {
        from(i,0,5)
        from(j,0,5)
        {
            if(j!=4) printf("%c ",puzzle[i][j]);
            else printf("%c\n",puzzle[i][j]);
        }
        }

    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-16 16:07:26

uva 227--模拟的相关文章

UVa 512 模拟!

背景:1--wa:最后一组输出不要空行!. 思路:我的思路,就是模拟整个表,把表实行操作之后的形态表示出来,把原表中的数据再在已经模拟的表中去查询.书上的思路是,先把一系列的操作保存在一个结构体数组中,每一个结构体数组元素对应一个操作,最后对于每一个坐标的系统执行这一套操作,就可以得出变化好的坐标!这种方法可能只要知道操作结构体的思想,写起来更容易. 学习:1.写完之后查一遍代码,比去单步调试效果好,输出中间值来调试,效果也很好. 我的代码: #include<stdio.h> #includ

UVa 12100 (模拟) Printer Queue

用一个队列模拟,还有一个数组cnt记录9个优先级的任务的数量,每次找到当前最大优先级的任务然后出队,并及时更新cnt数组. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <queue> 6 using namespace std; 7 8 struct Task 9 { 10 int pos, pri

UVa 101 (模拟) The Blocks Problem

题意: 有n个木块及n个木块堆,初始状态是第i个木块在第i个木块堆上.对应有四种操作,然后输出最终状态. 分析: 用一个vector<int>模拟一个木块堆,进行相应操作即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <string> 5 using namespace std; 6 7 const int maxn = 30; 8 int

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

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 340 模拟

背景:1Y! 学习:1.输入流中的全部数据都要处理干净. * #include<stdio.h> int main(void){ int n,count=1; while(scanf("%d",&n)!=EOF&&n){ int list[1000],temp[1000]; printf("Game %d:\n",count++); for(int i=0;;i++){ l1: for(int j=0;j<n;j++){ i

UVA 227 Puzzle - 输入输出

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

UVA 401-Palindromes(模拟)

Palindromes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is

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 1592模拟(map)

背景:第一因为找到结果之后没有及时的停止查找而wa了一发,改正后ac. 思路:首先对读入的每一个string,设置一个独特的ID,这样就把string变为int,后来比较的时候就会简化很多,设置ID的时候用map来赋予每一种string对应一个独特的ID.然后构建一个key为pair<int,int>的map,因为行比较多列比较少(列的数为10),就枚举列的所有组合,然后对每组组合来进行map判重. 我的代码: #include <set> #include <stack&g