UVA 10196 Check The Check(模拟)
生活随笔
收集整理的這篇文章主要介紹了
UVA 10196 Check The Check(模拟)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include <iostream>
#include <cstdlib>
using namespace std;char Map[8][8]; // 表示國際象棋棋子的位置。// 檢查坐標為(king_x,king_y)的王是否在坐標為(x,y)的卒攻擊范圍內(nèi),注意進攻方向的不同。
bool check_Pp (int x, int y, int king_x, int king_y)
{return (x - king_x) == 1 && abs(y - king_y) == 1;
}// 檢查坐標為(king_x,king_y)的王是否在坐標為(x,y)的馬攻擊范圍內(nèi)。
bool check_Nn (int x, int y, int king_x, int king_y)
{return (abs(x - king_x) == 2 && abs(y - king_y) == 1) ||(abs(x - king_x) == 1 && abs(y - king_y) == 2);
}// 檢查坐標為(king_x,king_y)的王是否在坐標為(x,y)的象攻擊范圍內(nèi)。
bool check_Bb (int x, int y, int king_x, int king_y)
{int step, current_x = x, current_y = y, direct_x, direct_y;bool checked = false;// 檢查象與王是否處于對角線。if (abs(x - king_x) == abs(y - king_y)){checked = true;// 判斷相對方位。direct_x = (x < king_x) ? 1 : -1;direct_y = (y < king_y) ? 1 : -1;// 是否有棋子相隔。step = abs (x - king_x);while (step > 1){current_x += direct_x;current_y += direct_y;if (Map[current_x][current_y] != '.'){checked = false;break;}step--;}}return checked;
}// 檢查坐標為(king_x,king_y)的王是否在坐標為(x,y)的車攻擊范圍內(nèi)。
bool check_Rr (int x, int y, int king_x, int king_y)
{int step, current_x = x, current_y = y, direct_x = 0, direct_y = 0;bool checked = false;// 車與王是否在同一行或者同一列,車與王之間是否有棋子相隔。if (x == king_x || y == king_y){checked = true;// 判斷相對方位。direct_x = (x == king_x) ? (0) : (x < king_x ? 1 : -1);direct_y = (y == king_y) ? (0) : (y < king_y ? 1 : -1);// 是否有棋子相隔。step = (direct_x == 0) ? abs(y - king_y) : abs(x - king_x);while (step > 1){current_x += direct_x;current_y += direct_y;if (Map[current_x][current_y] != '.'){checked = false;break;}step--;}}return checked;
}// 檢查坐標為(king_x,king_y)的王是否在坐標為(x,y)的王后攻擊范圍內(nèi)。
bool check_Qq(int x, int y, int king_x, int king_y)
{return check_Rr(x, y, king_x, king_y) || check_Bb(x, y, king_x, king_y);
}// 檢查給定棋盤狀態(tài)是否存在將軍局面。
void check (int cas)
{bool bChecked = false, white_checked = false;int b_king_x = -1, b_king_y = -1, w_king_x = -1, w_king_y = -1;int direct_x = 0, direct_y = 0, current_x = 0, current_y = 0, step = 0;// 查找白棋和黑棋王的位置。for (int i = 0; i < 8; i++)for (int j = 0; j < 8; j++){if (Map[i][j] == 'k'){b_king_x = i;b_king_y = j;}if (Map[i][j] == 'K'){w_king_x = i;w_king_y = j;}}// 假如未找到王的坐標,表明為空棋盤。if (b_king_x == -1)return;cout << "Game #" << cas << ": ";// 檢查棋子與王的是否存在將軍情況。for (int i = 0; i < 8; i++)for (int j = 0; j < 8; j++){switch (Map[i][j]){// 黑卒。case 'p':white_checked = check_Pp(w_king_x, w_king_y, i, j);break;// 白卒。case 'P':bChecked = check_Pp(i, j, b_king_x, b_king_y);break;// 黑馬。case 'n':white_checked = check_Nn(i, j, w_king_x, w_king_y);break;// 白馬。case 'N':bChecked = check_Nn(i, j, b_king_x, b_king_y);break;// 黑象。case 'b':white_checked = check_Bb(i, j, w_king_x, w_king_y);break;// 白象。case 'B':bChecked = check_Bb(i, j, b_king_x, b_king_y);break;// 黑車。case 'r':white_checked = check_Rr(i, j, w_king_x, w_king_y);break;// 白車。case 'R':bChecked = check_Rr(i, j, b_king_x, b_king_y);break;// 黑后。case 'q':white_checked = check_Qq(i, j, w_king_x, w_king_y);break;// 白后。case 'Q':bChecked = check_Qq(i, j, b_king_x, b_king_y);break;// 其他情況。default:break;}// 檢查將軍情況是否存在。if (bChecked){cout << "black king is in check." << endl;return;}if (white_checked){cout << "white king is in check." << endl;return;}}cout << "no king is in check." << endl;
}int main ()
{string tmp;int cas = 1, num = 0;while (getline(cin, tmp)){if (tmp != ""){for (int i = 0; i < 8; i++)Map[num][i] = tmp[i];num++;}else{check(cas);cas++;num = 0;}}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的UVA 10196 Check The Check(模拟)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年容器突然火了,到底什么是容器?
- 下一篇: 大数运算模板