首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

UVA 10196 - Check The Check (大将)

2013-10-01 
UVA10196 - Check The Check (将军)/** 题目的链接地址http://uva.onlinejudge.org/index.php?optioncom_

UVA 10196 - Check The Check (将军)

/*
* 题目的链接地址  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=29&page=show_problem&problem=1137 
** 作者 仪冰* QQ   974817955** 题目描述* 模拟棋盘。黑棋在棋盘的上半部分,用小写字母表示;白棋在下半部分,用大写字母表示。* 一共有六种棋子。* p ——> 只能走斜前方。即白棋只能走↖(左上),↗(右上);黑棋只能走↙(左下),↘(右下)* r ——> 可以走垂直方向和水平方向上走,可以走任意格。* b ——> 可以走对角线方向上走,可以走任意格。* q ——> 可以走垂直方向、水平方向、对角线方向,可以走任意格。* k ——> 可以走垂直方向、水平方向、对角线方向,只能走一格。* n ——> 和中国象棋马的走法一样,走日字。(没有蹩马腿这个规则)** 需要注意的是:* 对于r、b、q这三种棋子,如果在他们的行走的方向上有其他的棋子,则不能继续走了。** 输入样例..k.....ppp.pppp.........R...B..................PPPPPPPPK.......rnbqkbnrpppppppp................................PPPPPPPPRNBQKBNRrnbqk.nrppp..ppp....p......p.....bPP.........N..PP..PPPPRNBQKB.R................................................................* 输出样例Game #1: black king is in check.Game #2: no king is in check.Game #3: white king is in check.* 自己的输入样例R.pkp..R..ppp........B..B..Q..Q............R....................R.pkp..R.NpppN....N..B..B..Q..Q............R.........P......K...* 自己的输出样例Game #1: no king is in check.Game #2: black king is in check.*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int SIZEX = 9;   //棋盘行数const int SIZEY = 9;   //棋盘列数//这是Knight的边界数组, 在很多题目中都有用到边界数组int coordinate[8][2] = {-1,-2, -2,-1, -2,1, -1,2, 1,2, 2,1, 2,-1, 1,-2};/* 函数声明 */bool blackChessPawn(char chess[SIZEX][SIZEY], int x, int y, char ch); //黑棋的pawnbool whiteChessPawn(char chess[SIZEX][SIZEY], int x, int y, char ch); //白棋的pawnbool Rook(char chess[SIZEX][SIZEY], int x, int y, char ch);           //黑白棋的Rookbool Bishop(char chess[SIZEX][SIZEY], int x, int y, char ch);         //黑白棋的Bishopbool Queen(char chess[SIZEX][SIZEY], int x, int y, char ch);          //黑白棋的Queenbool Knight(char chess[SIZEX][SIZEY], int x, int y, char ch);         //黑白棋的Knightint main(){    char chessBoard[SIZEX][SIZEY]; //棋盘    int number = 0;                //计数器,判断是否结束程序    bool boolean = false;          //判断是否将军    int gameCount = 1;             //数据的组数    while (true)    {        for (int i=1; i<9; i++)        {            for (int j=1; j<9; j++)            {                scanf("%c", &chessBoard[i][j]);                if (chessBoard[i][j] == '.')                {                    number++;                }            }            scanf("%*c");        }        //判断程序是否结束        if (number == 64)        {            break;        }        number = 0;        scanf("%*c");  //吸收一个换行        for (int i=1; i<9; i++)        {            for (int j=1; j<9; j++)            {                switch (chessBoard[i][j])                {                    case 'p':                         boolean = blackChessPawn(chessBoard, i, j, 'K');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": white king is in check." << endl;                         }                         break;                    case 'P':                         boolean = whiteChessPawn(chessBoard, i, j, 'k');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": black king is in check." << endl;                         }                         break;                    case 'r':                         boolean = Rook(chessBoard, i, j, 'K');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": white king is in check." << endl;                         }                         break;                    case 'R':                         boolean = Rook(chessBoard, i, j, 'k');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": black king is in check." << endl;                         }                         break;                    case 'b':                         boolean = Bishop(chessBoard, i, j, 'K');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": white king is in check." << endl;                         }                         break;                    case 'B':                         boolean = Bishop(chessBoard, i, j, 'k');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": black king is in check." << endl;                         }                         break;                    case 'q':                         boolean = Queen(chessBoard, i, j, 'K');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": white king is in check." << endl;                         }                         break;                    case 'Q':                         boolean = Queen(chessBoard, i, j, 'k');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": black king is in check." << endl;                         }                         break;                    case 'n':                         boolean = Knight(chessBoard, i, j, 'K');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": white king is in check." << endl;                         }                         break;                    case 'N':                         boolean = Knight(chessBoard, i, j, 'k');                         if (boolean)                         {                             cout << "Game #" << gameCount                                  << ": black king is in check." << endl;                         }                         break;                    default : break;                }                if (boolean)                {                    break;                }            }            if (boolean)            {                break;            }        }        if (!boolean)        {            cout<< "Game #" << gameCount << ": no king is in check." << endl;        }        else        {            boolean = false;        }        gameCount++;    }    return 0;}/* 函数实现 */bool blackChessPawn(char chess[SIZEX][SIZEY], int x, int y, char ch) //黑棋的pawn{    int xx, yy;    xx = x+1;    yy = y-1;    if ((xx>=1) && (xx<=8) && (yy>=1) && (yy<=8) && (chess[xx][yy] == ch))    {        return true;    }    yy = y+1;    if ((xx>=1) && (xx<=8) && (yy>=1) && (yy<=8) && (chess[xx][yy] == ch))    {        return true;    }    return false;   //没有构成将军}bool whiteChessPawn(char chess[SIZEX][SIZEY], int x, int y, char ch) //白棋的pawn{    int xx, yy;    xx = x-1;    yy = y-1;    if ((xx>=1) && (xx<=8) && (yy>=1) && (yy<=8) && (chess[xx][yy] == ch))    {        return true;    }    yy = y+1;    if ((xx>=1) && (xx<=8) && (yy>=1) && (yy<=8) && (chess[xx][yy] == ch))    {        return true;    }    return false;      //没有构成将军}bool Rook(char chess[SIZEX][SIZEY], int x, int y, char ch)           //黑白棋的Rook{    int i;    //判断垂直方向上半段    for (i=x-1; i>=1; i--)    {        if (chess[i][y] == ch)        {            return true;        }        if (chess[i][y] != '.')  //如果有阻碍物        {            break;        }    }    //判断垂直方向下半段    for (i=x+1; i<=8; i++)    {        if (chess[i][y] == ch)        {            return true;        }        if (chess[i][y] != '.')  //如果有阻碍物        {            break;        }    }    //判断水平方向左半段    for (i=y-1; i>=1; i--)    {        if (chess[x][i] == ch)        {            return true;        }        if (chess[x][i] != '.')  //如果有阻碍物        {            break;        }    }    //判断水平方向右半段    for (i=y+1; i<=8; i++)    {        if (chess[x][i] == ch)        {            return true;        }        if (chess[x][i] != '.')  //如果有阻碍物        {            break;        }    }    return false;     //没有构成将军}bool Bishop(char chess[SIZEX][SIZEY], int x, int y, char ch)         //黑白棋的Bishop{    int xx;     //行数    int yy;     //列数    int Min;    //最小值。8*8的图中,行数和列数相同    int startX; //开始行    //int startY; //开始列    int i, j;    //判断左上角    xx = x-1;    yy = y-1;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x-Min;    //startY = y-Min;    //for (i=startX, j=startY; i<x; i++, j++)    for (i=x-1, j=y-1; i>=startX; i--, j--)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')    //如果有障碍物        {            break;        }    }    //判断右上角    xx = x-1;    yy = 8-y;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x-Min;    //startY = y+Min;    //for (i=startX, j=startY; i<x; i++, j--)    for (i=x-1, j=y+1; i>=startX; i--, j++)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')   //如果有障碍物        {            break;        }    }    //判断左下角    xx = 8-x;    yy = y-1;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x+Min;    //startY = y-Min;    //for (i=startX, j=startY; j<y; i--, j++)    for (i=x+1, j=y-1; i<=startX; i++, j--)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')      //如果有障碍物        {            break;        }    }    //判断右下角    xx = 8-x;    yy = 8-y;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x+Min;    //startY = y+Min;    //for (i=startX, j=startY; i>x; i--, j--)    for (i=x+1, j=y+1; i<=startX; i++, j++)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')    //如果有障碍物        {            break;        }    }    return false;  //不构成将军}bool Queen(char chess[SIZEX][SIZEY], int x, int y, char ch)          //黑白棋的Queen{    int xx;     //行数    int yy;     //列数    int Min;    //最小值。8*8的图中,行数和列数相同    int startX; //开始行    //int startY; //开始列    int i, j;    //判断左上角    xx = x-1;    yy = y-1;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x-Min;    //startY = y-Min;    //for (i=startX, j=startY; i<x; i++, j++)    for (i=x-1, j=y-1; i>=startX; i--, j--)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')    //如果有障碍物        {            break;        }    }    //判断右上角    xx = x-1;    yy = 8-y;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x-Min;    //startY = y+Min;    //for (i=startX, j=startY; i<x; i++, j--)    for (i=x-1, j=y+1; i>=startX; i--, j++)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')   //如果有障碍物        {            break;        }    }    //判断左下角    xx = 8-x;    yy = y-1;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x+Min;    //startY = y-Min;    //for (i=startX, j=startY; j<y; i--, j++)    for (i=x+1, j=y-1; i<=startX; i++, j--)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')      //如果有障碍物        {            break;        }    }    //判断右下角    xx = 8-x;    yy = 8-y;    if (xx < yy)    {        Min = xx;    }    else    {        Min = yy;    }    startX = x+Min;    //startY = y+Min;    //for (i=startX, j=startY; i>x; i--, j--)    for (i=x+1, j=y+1; i<=startX; i++, j++)    {        if (chess[i][j] == ch)        {            return true;        }        if (chess[i][j] != '.')    //如果有障碍物        {            break;        }    }    //判断垂直方向上半段    for (i=x-1; i>=1; i--)    {        if (chess[i][y] == ch)        {            return true;        }        if (chess[i][y] != '.')  //如果有阻碍物        {            break;        }    }    //判断垂直方向下半段    for (i=x+1; i<=8; i++)    {        if (chess[i][y] == ch)        {            return true;        }        if (chess[i][y] != '.')  //如果有阻碍物        {            break;        }    }    //判断水平方向左半段    for (i=y-1; i>=1; i--)    {        if (chess[x][i] == ch)        {            return true;        }        if (chess[x][i] != '.')  //如果有阻碍物        {            break;        }    }    //判断水平方向右半段    for (i=y+1; i<=8; i++)    {        if (chess[x][i] == ch)        {            return true;        }        if (chess[x][i] != '.')  //如果有阻碍物        {            break;        }    }    return false;   //没有构成将军}bool Knight(char chess[SIZEX][SIZEY], int x, int y, char ch)         //黑白棋的Knight{    int i;    int xx, yy;    for (i=0; i<8; i++)    {        xx = x+coordinate[i][0];        yy = y+coordinate[i][1];        if (chess[xx][yy] == ch)        {            return true;        }    }    return false;}

热点排行