检查下一步是否将死

Check if the next move is check-mate

我正在尝试检查马的下一步是否会同时威胁到kind和queen,如果有这样的位置就输出YES和位置,否则输出NO。

输入将仅包含 K 代表 King、Q 代表 Queen 和 N 代表骑士,并且它们不会重复超过一次。

示例输入:

........
........
........
...K....
....Q...
........
N.......
........

例如这个输入表示马是2A,皇后是4E,国王是5D。

这是我的代码:

#include <cmath>
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <ctype.h>
#include <fstream>
#include <cstddef>
#include <sstream>
#include<string.h>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;

int main ()
{
            string temp ;
            bool flag1 = false , flag2 = false ;
            int row1 = 0 , col1 = 0 , row2 = 0 , col2 = 0 ;
            int ik=0 , jk=0 , iq=0 , jq=0 , in=0 , jn=0 , i = 8 ;
            while ( std::getline (std::cin,temp) )
            {
                for (int j = 0 ; j<=7 ; j++)
                {
                    if(temp[j] == 'K')
                    { ik = i ; jk = j+1 ; }
                    else if(temp[j] == 'Q')
                    { iq = i ; jq = j+1 ; }
                    else if(temp[j] == 'N')
                    { in = i ; jn = j+1 ; }
                }
                i-- ;
            }

            // j for columns , i for rows
            // if jk = 1 means A , =2 means B , and so on
            int threatk[8][2] = {0} , threatq[8][2]= {0} , expn[8][2] = {0} ;

            // columns first ( position 0 )
            // rows second ( position 1 )
            threatk[0][0] = jk+1 ;
            threatk[0][1] = ik+2 ;
            threatk[1][0] = jk+1 ;
            threatk[1][1] = ik-2 ;
            threatk[2][0] = jk+2 ;
            threatk[2][1] = ik+1 ;
            threatk[3][0] = jk+2 ;
            threatk[3][1] = ik-1 ;
            threatk[4][0] = jk-1 ;
            threatk[4][1] = ik+2 ;
            threatk[5][0] = jk-1 ;
            threatk[5][1] = ik-2 ;
            threatk[6][0] = jk-2 ;
            threatk[6][1] = ik+1 ;
            threatk[7][0] = jk-2 ;
            threatk[7][1] = ik-1 ;

        threatq[0][0] = jq+1 ;
        threatq[0][1] = iq+2 ;
        threatq[1][0] = jq+1 ;
        threatq[1][1] = iq-2 ;
        threatq[2][0] = jq+2 ;
        threatq[2][1] = iq+1 ;
        threatq[3][0] = jq+2 ;
        threatq[3][1] = iq-1 ;
        threatq[4][0] = jq-1 ;
        threatq[4][1] = iq+2 ;
        threatq[5][0] = jq-1 ;
        threatq[5][1] = iq-2 ;
        threatq[6][0] = jq-2 ;
        threatq[6][1] = iq+1 ;
        threatq[7][0] = jq-2 ;
        threatq[7][1] = iq-1 ;

        expn[0][0] = jn+1 ;
        expn[0][1] = in+2 ;
        expn[1][0] = jn+1 ;
        expn[1][1] = in-2 ;
        expn[2][0] = jn+2 ;
        expn[2][1] = in+1 ;
        expn[3][0] = jn+2 ;
        expn[3][1] = in-1 ;
        expn[4][0] = jn-1 ;
        expn[4][1] = in+2 ;
        expn[5][0] = jn-1 ;
        expn[5][1] = in-2 ;
        expn[6][0] = jn-2 ;
        expn[6][1] = in+1 ;
        expn[7][0] = jn-2 ;
        expn[7][1] = in-1 ;

  for ( int a = 0 ; a<=7 ; a++)
        {
      for ( int b=0 ; b<=7 ; b++)
      {
if (  (  expn[a][0] == threatk[b][0] && expn[a][1] == threatk[b][1] ) )
      { flag1 =  true ; col1 = expn[a][0] ; row1 = expn[a][1] ;  }

        }
        }

  for ( int a = 0 ; a<=7 ; a++)
       {
          for ( int b=0 ; b<=7 ; b++)
          {
    if (  (  expn[a][0] == threatq[b][0] && expn[a][1] == threatq[b][1] ) )
          { flag2 =  true ; col2 = expn[a][0] ; row2 = expn[a][1] ;  }

          }
        }
if (  ( flag1 && flag2 ) && ( col1 >= 1 && col1 <= 8 && row1 >= 1 && row1 <= 8)
    &&  ( col2 >= 1 && col2 <= 8 && row2 >= 1 && row2 <= 8)
      && ( col1 = col2 && row1 = row2)  )
{   string out = "" ;
    if ( col1 == 1)out = "A" ;
    else if ( col1 == 2) out = "B" ;
    else if ( col1 == 3) out = "C" ;
    else if ( col1 == 4) out = "D" ;
    else if ( col1 == 5) out = "E" ;
    else if ( col1 == 6) out = "F" ;
    else if ( col1 == 7) out = "G" ;
    else if ( col1 == 8) out = "H" ;

    cout<<"YES"<<" "<<row1<<out ;
}
     else cout<<"NO" ;} '

我的方法是从骑士那里得到国王和王后的威胁位置,并将其与骑士的下一步可能行动进行比较 它工作正常,但在一些我不知道的测试中失败了,我只是想知道它是否通过了所有测试。 你觉得哪里不对?

在设计代码时,请确保所有部分都易于测试。设计只做一件清楚的事情并且可以轻松重用的功能。然后好好测试它们,这样你就可以找出你的代码的哪一部分是错误的。

很难检查您的代码并找出可能存在的问题。我在 Python 中写了一个解决方案,应该通过所有可能的边缘情况,我将在这里分享。解析输入输出不在其中。

N = 8

def generateThreat(y, x):
    threats = []

    candidate = (y+2, x+1)
    if (candidate[0] < N-1 and candidate[1] < N-1):
        threats.append(candidate)

    candidate = (y+2, x-1)
    if (candidate[0] < N-1 and candidate[1] >= 0):
        threats.append(candidate)

    candidate = (y-2, x+1)
    if (candidate[0] >= 0  and candidate[1] < N-1):
        threats.append(candidate)

    candidate = (y-2, x-1)
    if (candidate[0] >= 0 and candidate[1] >= 0):
        threats.append(candidate)

    candidate = (y+1, x+2)
    if (candidate[0] < N-1 and candidate[1] < N-1):
        threats.append(candidate)

    candidate = (y+1, x-2)
    if (candidate[0] < N-1 and candidate[1] >= 0):
        threats.append(candidate)

    candidate = (y-1, x+2)
    if (candidate[0] >= 0  and candidate[1] < N-1):
        threats.append(candidate)

    candidate = (y-1, x-2)
    if (candidate[0] >= 0 and candidate[1] >= 0):
        threats.append(candidate)

    return threats


def generateAllThreatsFromCurrent(y, x):
    all_threats = set()
    for next_step in generateThreat(y, x):
        all_threats.update(generateThreat(next_step[0], next_step[1]))

    return all_threats



def isMatePossible(king, queen, knight):
    y, x = knight
    all_threats = generateAllThreatsFromCurrent(y, x)
    if king in all_threats and queen in all_threads:
        return True

    return False