首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查下一个动作是否是检查伴侣。

检查下一个动作是否是检查伴侣。
EN

Stack Overflow用户
提问于 2016-06-15 05:53:53
回答 1查看 1.3K关注 0票数 0

我正在试着检查骑士的下一步是否会同时威胁到善良和王后,如果有这样的位置,它会输出是和位置,否则它将是否。

输入只包含国王的K,皇后的Q,骑士的N,它们不会被重复不止一次。

样本输入:

代码语言:javascript
复制
........
........
........
...K....
....Q...
........
N.......
........

例如,这个输入表明骑士是2A,皇后在4E,国王在5D。

这是我的密码:

代码语言:javascript
复制
#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" ;} '

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-15 13:46:54

在设计代码时,请确保所有部件都易于测试。设计功能,做一件明确的事情,可以很容易地重用。然后很好地测试它们,这样您就可以知道代码的哪一部分是错误的。

很难检查您的代码,并找出什么可能是错误的。我用Python编写了一个解决方案,它应该通过所有可能的边缘情况,我将在这里分享它。解析输入和输出不是它的一部分。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37827141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档