c++ - 检查下一步是否将死

标签 c++ chess

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

输入将只包含 K 代表国王,Q 代表皇后,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

关于c++ - 检查下一步是否将死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37827141/

相关文章:

尝试分配 64 位整数时 Swift 3 uint64 溢出

scala - 是否可以使用 Apache Spark RDD 进行递归计算?

c++ - 引用的条件分配

c++ - 关于C++中的友元函数

c++ - 混淆 char *notes[] = {"Ab", "F#", "B", "Gb", "D"};和字符**

machine-learning - MCTS 如何与 'precise lines' 配合使用

javascript - Chess.js 库。确定胜者和败者

algorithm - 没有Endgame Tablebases的国际象棋残局引擎的实现

c++ - 为什么这个 for 循环不正确?

c++ - 转换 C++ 层次结构以使用静态多态性