标签:max printf ref continue lazy 思维 get image bit
D. AB Graph 构造+思维
给你一个有向完全图,每一条边都有一个标记,有 a,b 两种标记,问你是否能构造一个长度为 m 的路径,满足按照路径上的标记形成的串是一个回文串。
分成奇偶讨论:
如果是奇数,那么显然是可以的
如果是偶数:
那么如果存在一条边两个方向是一样的,那么也是可以的
如果不一样,那么你只要找到下面这种情况就可以了:
为什么是这种情况呢?如果 n/2 是一个偶数,那么就可以是 y x x y ...
如果 n/2 是一个奇数,那么可以是 x x y y x x ...
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
typedef long long ll;
char s[maxn][maxn];
void print(int sx,int sy,int m){
printf("YES\n");
for(int i=1;i<=m+1;i++){
if(i&1) printf("%d",sx);
else printf("%d",sy);
if(i==m+1) printf("\n");
else printf(" ");
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
if(m&1) print(1,2,m);
else{
int sx = 0,sy = 0;
for(int i=1;i<=n;i++) {
for (int j = 1; j <= n; j++) {
if (i == j) continue;
if (s[i][j] == s[j][i]) sx = i, sy = j;
}
}
if(sx) print(sx,sy,m);
else{
if(n==2) printf("NO\n");
else{
printf("YES\n");
int a = 0,b = 0,c = 0;
if (s[1][2] == s[2][3])a = 1, b = 2, c = 3;
else if (s[2][3] == s[3][1])a = 2, b = 3, c = 1;
else if (s[3][1] == s[1][2])a = 3, b = 1, c = 2;
int val = m/2;
if(val&1){
for(int i=1;i<=m+1;i++){
if (i % 4 == 1) printf("%d",a);
else if (i % 4 == 2) printf("%d",b);
else if (i % 4 == 3) printf("%d",c);
else printf("%d",b);
if(i==m+1) printf("\n");
else printf(" ");
}
}
else{
for(int i=1;i<=m+1;i++){
if(i%4==1) printf("%d",b);
else if(i%4==2) printf("%d",c);
else if(i%4==3) printf("%d",b);
else printf("%d",a);
if(i==m+1) printf("\n");
else printf(" ");
}
}
}
}
}
}
}
标签:max printf ref continue lazy 思维 get image bit
原文地址:https://www.cnblogs.com/EchoZQN/p/14531186.html