初始化所有人都没有跳过舞。
判断一组里面第一个出现的之前跳过舞的人,让其他两个人的颜色为这个跳过舞的人的颜色后两位(在1,2,3之间循环)。若加和完之后大于3,自减3 。若全部人之前都没有跳过舞,直接赋值1,2,3 。
AC代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int color[100005];
int main() {
int n, m;
while(scanf("%d%d", &n, &m)!=EOF) {
int a, b, c;
memset(color, 0, sizeof(color));
for(int i = 1; i <= m; i++) {
scanf("%d%d%d", &a, &b, &c);
if(color[a] != 0) {
color[b] = color[a] + 1;
color[c] = color[a] + 2;
if(color[b] > 3)
color[b] -= 3;
if(color[c] > 3)
color[c] -= 3;
}
else if(color[b] != 0) {
color[a] = color[b] + 2;
color[c] = color[b] + 1;
if(color[a] > 3)
color[a] -= 3;
if(color[c] > 3)
color[c] -= 3;
}
else if(color[c] != 0) {
color[a] = color[c] + 1;
color[b] = color[c] + 2;
if(color[a] > 3)
color[a] -= 3;
if(color[b] > 3)
color[b] -= 3;
}
else {
color[a] = 1;
color[b] = 2;
color[c] = 3;
}
}
for(int i = 1; i <= n; i++) {
if(i == 1)
printf("%d", color[i]);
else
printf(" %d", color[i]);
}
printf("\n");
}
return 0;
}
简化一下代码量:
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int c[100005];
int n,m,x,y,z;
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(c,0,sizeof(c));
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
if(c[x]!=0)
{
c[y]=c[x]%3+1;
c[z]=c[y]%3+1;
}
else if(c[y]!=0)
{
c[z]=c[y]%3+1;
c[x]=c[z]%3+1;
}
else if(c[z]!=0)
{
c[x]=c[z]%3+1;
c[y]=c[x]%3+1;
}
else
{
c[x]=1;
c[y]=2;
c[z]=3;
}
}
for(int i=1;i<=n;i++)
printf("%d ",c[i]);puts("");
}
return 0;
}