穿越雷区

code

#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int MN = 101;
char s[MN][MN];
int N, starX, starY, endX, endY, occupy[MN][MN];
int MIN1 = 0x3f3f3f3f;
int inext[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
void dfs(int, int, int);
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int i, j;
	cin >> N,cin.get();
	//getchar();
	for (i = 0; i < N; ++i) {
		for (j = 0; j < N; ++j) {
			cin>>s[i][j],cin.get();
			//getchar();
			if ('A' == s[i][j]) {
				starX = i, starY = j;
			} else if ('B' == s[i][j]) {
				endX = i, endY = j;
			}
			occupy[i][j] = 0; //initialize
		}

	}
	occupy[starX][starY] = 1;
	dfs(starX, starY, 1);
	if (0x3f3f3f3f == MIN1)MIN1 = -1; //unexplore
	cout << MIN1 << '\n';
	return 0;
}
void dfs(int x, int y, int step) {
	int i, tx, ty;//tx:next x ,ty:next y
	for (i = 0; i < 4; ++i) {
		tx = x + inext[i][0];
		ty = y + inext[i][1];
		if (tx < 0 || ty < 0 || tx >= N || ty >= N) {
			continue;
		}
		if (tx == endX && ty == endY) {
			if (step < MIN1) {
				MIN1 = step;
			}
			return;
		}
		if (!occupy[tx][ty] && s[tx][ty] != s[x][y]) {
			occupy[tx][ty]=1;
			dfs(tx, ty, step + 1);
			occupy[tx][ty] = 0;

		}
	}
}

ref

Q

试题 历届真题 穿越雷区【第六届】【决赛】【B组】
     
资源限制
时间限制:1.0s   内存限制:256.0MB
  X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
  某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

  已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
  例如:
  A + - + -
  - + - - +
  - + + + -
  + - + - +
  B + - + -

  坦克车只能水平或垂直方向上移动到相邻的区。

  数据格式要求:

  输入第一行是一个整数n,表示方阵的大小, 4<=n<100
  接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
  A,B都只出现一次。

  要求输出一个整数,表示坦克从A区到B区的最少移动步数。
  如果没有方案,则输出-1

  例如:
  用户输入:
  5
  A + - + -
  - + - - +
  - + + + -
  + - + - +
  B + - + -

  则程序应该输出:
  10

  资源约定:
  峰值内存消耗(含虚拟机) < 512M
  CPU消耗 < 2000ms


  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
  注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
  注意:主类的名字必须是:Main,否则按无效代码处理。
上一篇:[转]Jira Issues Macro


下一篇:关于开源项目晶体管测试仪(Transistor Tester)烧录以及熔丝位参数设置