1000个测试用例都过了,为什么还是WA?

UVa1589 https://vjudge.net/problem/UVA-1589
udebuger https://www.udebug.com/UVa/1589

点进去有一组测试用例是1000个的,我完全一样,可是网站上提交就是WA,搞了一晚上,心态爆炸,求大神帮我脱离苦海

//UVa 1589 xiangqi 象棋
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

typedef struct
{
    char name;
    int row;
    int col;
}POS;
POS pos[10];
POS way[10];
int length = 7;
bool graph[11][11];
int istool (int prow, int pcol, int row, int col, bool mode)//判断炮在某一条线上是否有炮架子,返回炮架子的位置或0
{
    //p是目标, a是炮
    //mode = 1表示横, mode = 0 表示纵
    int i;
    if(mode)//横向
    {
        if(col < pcol) //炮在左侧
        {
            for(i = col + 1; i < pcol; ++i)
                if(graph[row][i] == 1)return i;
            return 0;
        }
        if(col > pcol) //炮在右侧
            for(i = col - 1; i > pcol; --i)
                if(graph[row][i] == 1) return i;
        return 0;
    }
    else
    {
        if(row < prow) //炮在下方
        {
            for(i = row + 1; i < prow; ++i)
                if(graph[i][col] == 1)return i;
            return 0;
        }
        if(row > prow) //炮在上方
        {
            for(i = row - 1; i > prow; --i)
                if(graph[i][col] == 1)return i;
            return 0;
        }
    }
}
bool iskill(int prow, int pcol, int row, int col, char name)//计算红色棋子能否到达P位置
{
    if(prow == row && pcol == col) return 0;//不能攻击自身位置
    switch(name)//判断红色棋子的属性
    {
        case 'G': //帅 当帅和P位置一条线且中间没有阻挡的时候,可以到达
            if (pcol != col) return 0;
            else {
                for (int i = prow + 1; i < row; ++i)
                    if (graph[i][col] == 1) return 0;
                return 1;
            }
        case 'R'://车
            if (pcol == col)//同一列的情况,中间不能有阻挡
            {
                int min = row < prow ? row : prow;
                int max = row > prow ? row : prow;
                for (int i = min + 1; i < max; ++i)
                    if (graph[i][col] == 1) return 0;
                return 1;
            } else if (prow == row)//同一行的情况,中间不能有阻挡
            {
                int min = col < pcol ? col : pcol;
                int max = col > pcol ? col : pcol;
                for (int i = min + 1; i < max; ++i)
                    if (graph[row][i] == 1) return 0;
                return 1;
            } else return 0;
        case 'C':
            if (prow == row) //横向炮击
            {
                int pao = istool(prow, pcol, row, col, 1);//炮架子的位置
                if (!pao) return 0;//没有炮架子
                //下面是有炮架子的情况,只需要保证炮和目标之间没有棋子即可。
                int min = pao < pcol ? pao : pcol;
                int max = pao > pcol ? pao : pcol;
                for (int i = min + 1; i < max; ++i)
                    if (graph[row][i] == 1) return 0;
                return 1;
            }
            if (pcol == col)//纵向炮击
            {
                int pao = istool(prow, pcol, row, col, 0);//炮架子的位置
                if (!pao) return 0;//没有炮架子
                //下面是有炮架子的情况,只需要保证炮和目标之间没有棋子即可
                int min = pao < prow ? pao : prow;
                int max = pao > prow ? pao : prow;
                for (int i = min + 1; i < max; ++i)
                    if (graph[i][col] == 1) return 0;
                return 1;
            }
            else return 0;
        case 'H':
            int dx = pcol - col;//横坐标之差
            int dy = prow - row;//纵坐标之差
            if(dy == 2)
            {
                if(dx == 1 || dx == -1)
                    if(graph[row + 1][col] == 0) return 1;
                    else return 0;
                else return 0;
            }
            if(dy == -2)
            {
                if(dx == 1 || dx == -1)
                    if(graph[row - 1][col] == 0) return 1;
                    else return 0;
                else return 0;
            }
            if(dx == 2)
            {
                if(dy == 1 || dy == -1)
                    if(graph[row][col + 1] == 0) return 1;
                    else return 0;
                else return 0;
            }
            if(dx == -2)
            {
                if(dy == 1 || dy == -1)
                    if(graph[row][col - 1] == 0) return 1;
                    else return 0;
                else return 0;
            }
    }
}
int getways(int now_row, int now_col)//黑方老将可能的走位
{
    switch(now_row)
    {
        case 1:
            switch(now_col)
            {
                case 4:
                    way[0].row = 1, way[0].col = 5;
                    way[1].row = 2, way[1].col = 4;
                    return 2;
                case 5:
                    way[0].row = 1, way[0].col = 4;
                    way[1].row = 1, way[1].col = 6;
                    way[2].row = 2, way[2].col = 5;
                    return 3;
                case 6:
                    way[0].row = 1, way[0].col = 5;
                    way[1].row = 2, way[1].col = 6;
                    return 2;
            }
        case 2:
            switch(now_col)
            {
                case 4:
                    way[0].row = 1, way[0].col = 4;
                    way[1].row = 3, way[1].col = 4;
                    way[2].row = 2, way[2].col = 5;
                    return 3;
                case 5:
                    way[0].row = 1, way[0].col = 5;
                    way[1].row = 3, way[1].col = 5;
                    way[2].row = 2, way[2].col = 4;
                    way[3].row = 2, way[3].col = 6;
                    return 4;
                case 6:
                    way[0].row = 1, way[0].col = 6;
                    way[1].row = 3, way[1].col = 6;
                    way[2].row = 2, way[2].col = 5;
                    return 3;
            }
        case 3:
            switch(now_col)
            {
                case 4:
                    way[0].row = 3, way[0].col = 5;
                    way[1].row = 2, way[1].col = 4;
                    return 2;
                case 5:
                    way[0].row = 3, way[0].col = 4;
                    way[1].row = 3, way[1].col = 6;
                    way[2].row = 2, way[2].col = 5;
                    return 3;
                case 6:
                    way[0].row = 3, way[0].col = 5;
                    way[1].row = 2, way[1].col = 6;
                    return 2;
            }
    }
}
int main()
{
    while(cin >> length >> pos[0].row >> pos[0].col)
    {
        if(!length) break;
        memset(graph, 0, sizeof(graph));
        int x;
        for(int i = 1; i <= length; ++i)
        {
            char ch;
            while (ch = getchar())
                if(ch <= 'Z' && ch >= 'A') break;
            pos[i].name = ch;
            scanf("%d %d", &pos[i].row, &pos[i].col);
            graph[pos[i].row][pos[i].col] = 1;//在棋盘上放置棋子
            if(pos[i].name == 'G') x = i;
        }
        int flag = iskill(pos[0].row, pos[0].col, pos[x].row, pos[x].col, pos[x].name);
        if(flag) cout << "NO" << endl;
        else
        {
            int num = getways(pos[0].row, pos[0].col);
            int i, j;
            for(i = 0; i < num; ++i)
            {
                for(j = 1; j <= length; ++j)
                    if(iskill(way[i].row, way[i].col, pos[j].row, pos[j].col, pos[j].name))
                        break;
                if(j > length) break;
            }
            if(i == num) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
    return 0;
}

 

请问你自己是否分析过原因,做了哪些尝试?