2016-06-15 30 views
0

我想检查骑士的下一步是否会同时威胁kind和queen,如果有这样的位置,它会输出YES和position,否则会是NO。检查下一步是否为check-mate

输入将只包含K为王,Q为皇后,N为骑士,并且它们不会重复多次。

样品输入:

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

该输入例如指示该骑士是2A,Queen是在图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" ;} ' 

我的做法是得到国王和骑士女王的威胁位置,以及与之相比较下一个可能的移动为骑士 它的正常工作,但它在一些测试中失败了,我没有意识到我只是知道它是否通过了所有的测试。 你认为什么是错的?

+1

标题有误导性;所描述的问题与被拘留者无关。 (死亡是国王受到袭击的情况,并且攻击无法解决,这是一个非常困难的问题,因为通常有三种解决方案:移动国王,移除攻击者,或者放入其他棋子) – MSalters

+0

其中这是从哪里来的?你能分享链接吗? – vegi

回答

1

当您设计代码时,请确保所有部件都易于测试。设计功能可以完成一件清晰的事情,并且可以轻松地重复使用。之后对它们进行测试,以便可以确定代码的哪部分是错误的。

这是很难审查你的代码,并找出什么可能是错误的。我在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