UVa 11352 - Crazy King

題目:給定一個國際象棋的棋盤,上面有幾個對方的馬,已知己方的王當前位置和膜表位置,問最少幾步能走過去;

            行走過程中,除了起點和終點外不能走入對方馬的攻擊位置,對方的馬不會移動。

分析:圖論,搜索,最短路。直接利用bfs搜索即可。

說明:注意那個輸出中的’'‘,WA好幾次才發現╮(╯▽╰)╭。

#include <cstring>
#include <cstdio>

char maps[101][101];
int  dxy[8][2] = {-2,-1,-2,1,2,-1,2,1,-1,-2,-1,2,1,-2,1,2};
int  Dxy[8][2] = {-1,-1,-1,0,-1,1,1,-1,1,0,1,1,0,-1,0,1};
int  Q[10001], S[10001];

int bfs(int x0, int y0, int n, int m)
{
	if (x0 < 0 || y0 < 0) return 0;
	int move = 0, save = 1;
	Q[S[0] = 0] = x0*100+y0;
	while (move < save) {
		int now = Q[move ++];
		for (int k = 0; k < 8; ++ k) {
			int x = now/100+Dxy[k][0];
			int y = now%100+Dxy[k][1];
			if (x >= 0 && x < n && y >= 0 && y < m) {
				if (maps[x][y] == 'B') return S[move-1]+1;
				if (maps[x][y] == '.') {
					maps[x][y] = 'X';
					Q[save] = 100*x+y;
					S[save] = S[move-1]+1;
					save ++;
				}
			}
		}
	}
	return 0;
}

int main()
{
	int t, n, m;
	while (~scanf("%d",&t))
	while (t --) {
		scanf("%d%d",&n,&m);
		for (int i = 0; i < n; ++ i)
			scanf("%s",maps[i]);
		
		int s_x = -1, s_y = -1;
		for (int i = 0; i < n; ++ i)
		for (int j = 0; j < m; ++ j) {
			if (maps[i][j] == 'A') {
				s_x = i; s_y = j;
			}
			if (maps[i][j] != 'Z') continue;
			for (int k = 0; k < 8; ++ k) {
				if (i+dxy[k][0] < 0 || i+dxy[k][0] >= n) continue;
				if (j+dxy[k][1] < 0 || j+dxy[k][1] >= m) continue;
				if (maps[i+dxy[k][0]][j+dxy[k][1]] == '.')
					maps[i+dxy[k][0]][j+dxy[k][1]] = 'X';
			}
		}

		int step = bfs(s_x, s_y, n, m);
		if (step)
			printf("Minimal possible length of a trip is %d\n",step);
		else printf("King Peter, you can't go now!\n");
	} 
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值