60分过不去,不知道哪里的问题
查看原帖
60分过不去,不知道哪里的问题
459320
QRZ2814514743楼主2024/3/20 20:40

大佬帮忙看一下,谢谢了

#include <bits/stdc++.h>
using namespace std;

//定义inf=-1,初始化数组用
long long inf = -1;
//Last在递归函数中保存最终结果
unsigned long long Last = 0;
//All数组保存结果
long long All[22][22];

unsigned long long MAIN(long long a, long long b, long long c[3][9]) {
	//判断(a,b)是不是马的落点以及马本身
	if ((a == c[0][0] && b == c[1][0]) ||  (a == c[0][1] && b == c[1][1]) || (a == c[0][2] && b == c[1][2])
	        || (a == c[0][3] && b == c[1][3]) || (a == c[0][4] && b == c[1][4]) || (a == c[0][5] && b == c[1][5])
	        || (a == c[0][6] && b == c[1][6]) || (a == c[0][7] && b == c[1][7]) || (a == c[0][8] && b == c[1][8])) {
		return 0;
	}
	if (a == 0) {
		return 1;
	}
	if (b == 0) {
		return 1;
	}
	//如果不是-1,表示已经被计算过了
	if (All[a][b] != -1) {
		return All[a][b];
	}

	//状态转移
	Last = MAIN(a, b - 1, c ) + MAIN(a - 1, b, c );
	//算出来存入All
	All[a][b] = Last;
	return Last;
}



int main(int argc, char **argv) {
  	//初始化保存结果的数组
	memset(All, inf, sizeof(All));
  
	long long a, b, c1, c2;
	cin >> a >> b >> c1 >> c2;
	long long c[3][9];
	
	//这里对马坐标进行计算和赋值
	c[0][0] = c1 + 1;
	c[1][0] = c2 + 2;

	c[0][1] = c1 + 2;
	c[1][1] = c2 + 1;

	c[0][2] = c1 + 2;
	c[1][2] = c2 - 1;

	c[0][3] = c1 + 1;
	c[1][3] = c2 - 2;

	c[0][4] = c1 - 1;
	c[1][4] = c2 - 2;

	c[0][5] = c1 - 2;
	c[1][5] = c2 - 1;

	c[0][6] = c1 - 2;
	c[1][6] = c2 + 1;

	c[0][7] = c1 - 1;
	c[1][7] = c2 + 2;

	c[0][8] = c1;
	c[1][8] = c2;

	cout << MAIN(a, b, c);
}
2024/3/20 20:40
加载中...