原创马踏联营

来源:互联网 发布:linux apr版本 编辑:程序博客网 时间:2024/05/16 17:39
/*Name: 原创马踏联营 Author: 巧若拙 Description:描述:给定一个m*n的棋盘,格子上分布着黑马,白马或空白(分别用数字1,2和0表示),按照马踩日的行棋规则,每个棋子可以走到空白棋格或有对方子的位置上(吃掉对方的马),其中若是吃掉对方的子,则可以继续行棋; 若是走到空白棋格,则不能再动。输入:第一行是三个整数m(1≤m≤20),n(1≤n≤20)和q(取值1或2),分别表示行,列数和当前走动棋子的颜色。接下来m行中,每行有n个用空格隔开的数字。其中1表示黑马,2表示白马,0表示空白 输出:三个整数,分别走动棋子的初始坐标和它能够吃掉对方的棋子数量。若有多个棋子满足条件,则输出坐标值之和最小的一个。 样例输入: 6 6 11 2 0 0 0 00 0 1 1 0 02 1 0 0 1 00 0 2 0 0 00 0 0 2 2 00 0 0 0 0 0样例输出2 4 4 (表示坐标为(2,4)的黑马能连续吃掉对方4个子 */#include<iostream>#include<cstring>using namespace std;const int M = 20;const int N = 20;int A[M][N];bool lib[M][N]; //标记该点是否已经来过 int DicX[8] = {-1,-2,-2,-1,1,2,2,1}; //从西北角开始向各个方向移动,x坐标相当于行坐标 int DicY[8] = {-2,-1,1,2,2,1,-1,-2}; //从西北角开始向各个方向移动,y坐标相当于列坐标 int s, maxS, m, n, q; void DFS(int x, int y, int s); //x和y分别表示当前行坐标和列坐标,s表示目前走棋路线已经吃掉的棋子数量 int main() {cin >> m >> n >> q;    for (int i=0; i<m; i++){for (int j=0; j<n; j++){cin >> A[i][j];}}int x, y;for (int i=0; i<m; i++){for (int j=0; j<n; j++){if (A[i][j] == q) {memset(lib, 0, sizeof(lib));    s = maxS; //当前最大值     DFS(i, j, 0);    if (s < maxS)//更新了最大值,记录棋子的初始坐标 {x = i;y = j;} } }}cout << x+1 << " " << y+1 << " " << maxS << endl;    return 0;}void DFS(int x, int y, int s)//x和y分别表示当前行坐标和列坐标,s表示目前走棋路线已经吃掉的棋子数量 {int nx, ny;for (int i=0; i<8; i++){nx = x + DicX[i];    ny = y + DicY[i];if (nx >= 0 && nx < m && ny >= 0 && ny < n && !lib[nx][ny] && A[nx][ny] != q){if (A[nx][ny] != 0) //吃掉对方棋子,继续走棋 {  lib[nx][ny] = 1; //走过了就不能再来 if (s == maxS) //更新吃子最大值 maxS = s + 1;DFS(nx, ny, s+1);lib[nx][ny] = 0; //还原}}}}