检查下一步是检查员

Check if the next move is check-mate

本文关键字:检查员 下一步 检查      更新时间:2023-10-16

我试图检查骑士的下一步行动是否会同时威胁到皇后,如果有这样的位置,它将输出是的,否则将是否。

输入仅包含King,Q for Queen和n的n只包含k,而n仅包含k的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