得到错误答案

时间:2018-04-03 07:19:03

标签: c++

所以我试图解决一个关于HackerEarth的问题,我只是不知道出了什么问题.12个测试用例中有11个通过但是有一个失败了... 这是一个问题:

  斯蒂芬希望探索这个空间,让我们说哪个是N行和N.   列。每个单元由行星或黑洞组成,用a表示   人物'。'或者分别是'#'。斯蒂芬只能访问行星和   他不能移出电网。

     斯蒂芬希望探索未开发的空间。所以他遵循了   霍金博士指导探索空间。霍金博士发送   他是由长度为L的字符串S描述的一系列动作   字符是'U','D','R','L'之一,表示方向:向上,向下,   左右分别。

     

根据起始单元格,可以进行所有L移动   不可能。斯蒂芬认为每个星球都是起始星球   想知道他之前可以做出多少次动作   被迫停止。例如,如果S以“R”开头,而是以“R”开头   从起始单元格开始是一个黑洞(或在网格外面),   斯蒂芬会做0步。

     

你的任务是找到斯蒂芬将从每个人做的动作的数量   起始单元格,并打印这些数字的按位异或。

     

输入输入的第一行包含表示的整数T.   测试用例数量。 T测试用例的描述如下。

     

每个测试用例的第一行包含两个整数L和N.   表示移动序列的长度和网格的大小。

     

测试用例的第二行包含表示的字符串S.   移动顺序。

     

接下来N行描述网格。第i行包含一串字符串   长度N表示网格的第i行。

     

输出对于每个测试用例,输出包含一个整数的单行    - Limak从每个人的移动数量的按位异或   可能的起始单元。

     

约束条件1≤T≤100,1≤L≤1000,1≤N≤1000

示例输入:

2
3 4
DDU
#..#
#...
...#
..#.

10 4
RLLRDDLUUL
....
.#..
..#.
.#.#

示例输出:

2
3

说明:

Test case 1. We are given the grid of size N = 4, and a sequence of L = 3 moves. For each empty cell of the grid, below you can see the number of moves Limak would make:

# 3 3 # 
# 3 1 0 
1 1 0 # 
0 0 # 0
The answer is 3 xor 3 xor 3 xor 1 xor 1 xor 1 = 2.

Test case 2. Again, below you can see the number of moves Limak would make from each cell:

2 4 5 0 
0 # 2 0 
2 0 # 0 
0 # 0 #

这是我的解决方案:

#include<iostream>
using namespace std;
char **a;
int l,n;
bool pos(int& x,int& y,char m)
{
    if(m=='D')x++;
    if(m=='U')x--;
    if(m=='L')y--;
    if(m=='R')y++;
    if(x<0 || x>=n || y<0 || y>=n)return false;
    if(a[x][y]=='#')return false;
    return true;
}
int val(int x,int y,string s)
{
    int t=0;
    for(int i=0;i<s.length();i++)
    {
        if(pos(x,y,s[i]))t++;
        else break;
    }
    return t;
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        int ans=0;
        cin>>l>>n;
        a=new char*[n];
        for(int i=0;i<n;i++)a[i]=new char[n];
        string s;cin>>s;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                cin>>a[i][j];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(a[i][j]=='.')
                {
                    ans=ans^val(i,j,s);
                }
            }
        }
        cout<<ans<<endl;
    }
}

有人能发现我逻辑中的任何错误吗?该解决方案适用于12个案例中的11个,但是1个失败,我无法发现问题..任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

这个“答案”不会解决你的问题,但我希望它会给你一些提示来自行解决。

您的代码有几个问题。您主要使用全局变量来传达您的状态,这与编程中的任何内容都非常接近。

您可能希望在if函数中将前4个switch句与pos交换。

您正在修改x函数中的ypos值,这使得很难推理。这个函数有许多功能,它们是的东西 - 具有不止一件事的功能使得很难弄清楚上发生了什么并使其难以应用于其他地方

我建议你制作一个legal_position功能,它会获取地图和一个x y坐标,告诉您这个位置是否合法。然后只需执行每个命令,直到其中一个命令非法并相应地更新您的位置。

如果你解决了这些问题,你的程序应该大大减少代码大小,你最好能够弄清楚你做错了什么。