给定一张有向无回图,Max和Lucas执石子在图上走。
Max走奇数轮,每个人下一步经过的边上的字母,都要比上一轮的大。
无法再走的时候,就输了。
如果Max,Lucas分别在i,j时,Max会赢就输出A,否则B。
记忆化搜索。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 100 + 5;
int dp[maxn][maxn][26]; //
typedef pair<int, int> pr;
vector<pr> mp[maxn];
int solve(int u,int v,int lc = 0)//当前这个人在u,另一个人在v//先手胜返回1
{
int &t = dp[u][v][lc];
if(~t) return t;
for(pr &p:mp[u]){
if(p.second >= lc){
if(!solve(v, p.first,p.second)) return t = 1;//如果当前这个人沿着p走,下一轮的先手(即这轮的后手)会输,则这一局的先手胜
}
}
return t = 0;//每一种走法都不会胜,则输
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int a,b;
char c;
for (int i = 0; i< m; i ++) {
scanf("%d %d %c",&a,&b,&c);
mp[a].push_back({b,c - 'a'});
}
memset(dp, -1, sizeof(dp));
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
printf("%c",solve(i,j) ? 'A' : 'B');
}
printf("\n");
}
return 0;
}