예제 #1
0
int main() {
	freopen("D.in", "r", stdin);
	freopen("D.out", "w", stdout);
	while (true) {
		scanf("%d", &n);
		if (n == 0) break;

		memset(map, -1, sizeof map);

		int nBlack = 0, nWhite = 0;
		for (int i = 0; i < n; i++) {
			int x, y, c;
			scanf("%d%d%d", &x, &y, &c);
			map[x][y] = c;
			if (c == 0) nWhite++;
			else nBlack++;
		}

		std::vector<std::pair<int, int> > free;
		for (int i = 0; i < 15; i++)
			for (int j = 0; j < 15; j++)
				if (map[i][j] == -1) {
					free.push_back(std::make_pair(i, j));
				}

		int firstMove;
		if (nBlack == nWhite) {
			firstMove = 1;
		} else if (nBlack == nWhite + 1) {
			firstMove = 0;
		} else {
			puts("Invalid.");
			continue;
		}
		
		std::pair<bool, std::pair<int, int> > ret;

		ret = checkOne(free, firstMove);
		if (ret.first) {
			printf("Place %s at (%d,%d) to win in 1 move.\n", NAME[firstMove], ret.second.first, ret.second.second);
			continue;
		}

		if (checkTwo(free, firstMove)) {
			printf("Lose in 2 moves.\n");
			continue;
		}

		ret = checkThree(free, firstMove);
		if (ret.first) {
			printf("Place %s at (%d,%d) to win in 3 moves.\n", NAME[firstMove], ret.second.first, ret.second.second);
			continue;
		}
		
		puts("Cannot win in 3 moves.");
	}
	return 0;
}
예제 #2
0
int
getBEtime (char *toptarg, char flag, time_t tTime[])
{
    char  *cp ,*cp1, *cp3;
    time_t  sbtime;
    int cc;
    char endTime;

    checkThree (toptarg, ',', &cp, &cp1, &cp3);
    if (cp1 != NULL) {
	lserrno = LSE_BAD_TIME;
        return -1;
    }

    if (cp == NULL) {

	checkThree (toptarg, '.', &cp, &cp1, &cp3);
	if (cp != NULL) {
	    lserrno = LSE_BAD_TIME;
	    return -1;
        }
	endTime = FALSE;
	sbtime = 0;
	if ((cc = getPtime (toptarg, endTime, sbtime, flag, &tTime[0])) == -1)
	    return -1;
	endTime = TRUE;
	if (getPtime (toptarg, endTime, sbtime, flag, &tTime[1]) == -1)
	    return -1;
	if (checkBEtime ( tTime[0], tTime[1]) == -1)
	    return -1;
	return 0;
    }





    while (TRUE) {
	if ( *toptarg == ',' ) {
	    tTime[0] = 0;
	    toptarg ++;
	    break;
	}
	if ( (*toptarg == '.')&&(*(toptarg+1) == ',') ) {
	    tTime[0] = time(0);
	    toptarg = cp;
	}
	if ( *toptarg == ',' ) {
	    tTime[0] = time(0);
	    toptarg = cp +1;
	    break;
	}
	if ( (*toptarg == '.') && (*(toptarg+1) == '-') ) {
	    sbtime = time(0);
	    toptarg += 2;
	    *cp = '\000';
	    endTime = FALSE;
	    if (getPtime (toptarg, endTime, sbtime, flag, &tTime[0]) == -1)
	        return -1;
	    toptarg = cp+1;
	    break;
	}

	if ( (*toptarg == '@') && (*(toptarg+1) == ',') ) {
	    endTime = FALSE;
	    tTime[0] = getToday(endTime);
	    toptarg = cp+1;
	    break;
	}
	if ( (*toptarg == '@') && (*(toptarg+1) == '-') ) {
	    endTime = FALSE;
	    sbtime = getToday(endTime);
	    toptarg += 2;
	    *cp = '\000';
	    if (getPtime (toptarg, endTime, sbtime, flag, &tTime[0]) == -1)
	        return -1;
	    toptarg = cp+1;
	    break;
	}

	endTime = FALSE;
	*cp = '\000';
	sbtime = 0;
	if (getPtime (toptarg, endTime, sbtime, flag, &tTime[0]) == -1) {
	    *cp = ',';
	    return -1;
        }
	toptarg = cp + 1;
	break;
    }




    if ( (*toptarg == '.' && *(toptarg+1) == '\0') || (*toptarg == '\0')) {
	tTime[1] = time(0);
	if (checkBEtime ( tTime[0], tTime[1] ) == -1) {
	    *cp = ',';
	    return -1;
        }
	return 0;
    }
    if ((*toptarg == '.') && (*(toptarg+1) == '-')) {
	sbtime = time(0);
	toptarg += 2;
	endTime = FALSE;
	if (getPtime (toptarg, endTime, sbtime, flag, &tTime[1]) == -1) {
	    *cp = ',';
	    return -1;
        }
	if (checkBEtime ( tTime[0], tTime[1] ) == -1) {
	    *cp = ',';
	    return -1;
        }
	return 0;
    }

    if ((*toptarg == '@') && (*(toptarg+1) == '\0')) {
	endTime = TRUE;
	tTime[1] = getToday(endTime);
	if (checkBEtime ( tTime[0], tTime[1] ) == -1) {
	    *cp = ',';
	    return -1;
        }
	return 0;
    }
    if ((*toptarg == '@') && (*(toptarg+1) == '-')) {
	endTime = TRUE;
	sbtime = getToday(endTime);
	toptarg += 2;
	if (getPtime (toptarg, endTime, sbtime, flag, &tTime[1]) == -1) {
	    *cp = ',';
	    return -1;
        }
	if (checkBEtime ( tTime[0], tTime[1] ) == -1) {
	    *cp = ',';
	    return -1;
        }
	return 0;
    }

    endTime = TRUE;
    sbtime = FALSE;
    toptarg = cp+1;
    if (getPtime (toptarg, endTime, sbtime, flag, &tTime[1]) == -1) {
	*cp = ',';
        return -1;
    }
    if (checkBEtime ( tTime[0], tTime[1] ) == -1) {
	*cp = ',';
	return -1;
    }
    return 0;

}
예제 #3
0
static int
getPtime (char *toptarg, char endTime, time_t sbtime, char flag, time_t
*Ptime)
{
#define MINU   1
#define HOUR   2
#define DAY    4
#define MONTH  8
#define YEAR  16

    char *cp, *cp1, *cp2, *cp3;
    time_t ptimev;
    struct tm *tmPtr;
    int  ptimef = 0, m, tempInt;



    if ( ! checkChar (toptarg, &cp)) {
	lserrno = LSE_BAD_TIME;
	return -1;
    }
    checkThree (toptarg, '/', &cp1, &cp2, &cp3);
    if ( cp2 != NULL ) {
	if ( (cp1+1) == cp2 ) {
	    lserrno = LSE_BAD_TIME;
	    return -1;
        }
	*cp2 = '0';
	checkThree (toptarg, '/', &cp1, &cp, &cp3);
	*cp2 = '/';
	if ( cp3 != NULL ) {
	    lserrno = LSE_BAD_TIME;
	    return -1;
        }
    }
    checkThree (toptarg, ':', &cp1, &cp2, &cp3);
    if ( cp1 == NULL ) {
	checkThree (toptarg, '/', &cp1, &cp2, &cp3);
	if (( cp3 != NULL ) && ( *(cp3+1) != '0' )) {
	    lserrno = LSE_BAD_TIME;
	    return -1;
        }
    }
    checkThree (toptarg, ':', &cp1, &cp2, &cp3);
    if ( cp2 != NULL ) {
	lserrno = LSE_BAD_TIME;
        return -1;
    }
    if ( (cp1 != NULL) && ((cp1[-1] == '/') || (cp1[1] == '/'))) {
	lserrno = LSE_BAD_TIME;
	return -1;
    }




    if (flag == 'w') {
        tmPtr = malloc (sizeof (struct tm));
        tmPtr->tm_year = 70;
        tmPtr->tm_mon  =  0;
        tmPtr->tm_mday =  1;
        tmPtr->tm_hour =  0;
        tmPtr->tm_min  =  0;
    }
    else {
        ptimev = time(0);
        tmPtr = localtime(&ptimev);
    }
    tmPtr->tm_sec = 0;
    tmPtr->tm_isdst = -1;




    cp = cp1;

    checkThree (toptarg, '/', &cp1, &cp2, &cp3);

    if ( (cp == NULL) && (cp1 != NULL) &&
	    (cp2 == NULL) && (cp1 > toptarg) ) {
        *cp1 = '\000';
	tempInt = atoi(toptarg);
	if (tempInt > 12) {
	    ptimef |= YEAR;
	    tmPtr->tm_year = tempInt;
	    if (checkYear(&tmPtr->tm_year) == -1) {
		*cp1 = '/';
		return -1;
            }
	    if (( *(cp1+1) != '\000')) {
		ptimef |= MONTH;
		tmPtr->tm_mon = atoi(cp1+1);
		if (checkTime(MONTH, tmPtr->tm_mon) == -1) {
		    *cp1 = '/';
		    return -1;
                }
            }
	    else
		tmPtr->tm_mon = ( endTime ? 12 : 1 );
	    if (endTime) {
		m = tmPtr->tm_mon;
		if ((m==1) || (m==3) || (m==5) || (m==7) ||
		    (m==8) || (m==10) || (m==12))
		    tmPtr->tm_mday = 31;
                else if (m != 2)
		    tmPtr->tm_mday = 30;
                else if (tmPtr->tm_year%4 == 0)
		    tmPtr->tm_mday = 29;
                else
		    tmPtr->tm_mday = 28;
            }
	    else
		tmPtr->tm_mday = 1;
        }
	else {
	    ptimef |= MONTH;
	    tmPtr->tm_mon = tempInt;
	    if (checkTime(MONTH, tmPtr->tm_mon) == -1) {
		*cp1 = '/';
		return -1;
            }
	    if ( *(cp1+1) != '\000') {
	        ptimef |= DAY;
	        tmPtr->tm_mday = atoi(cp1+1);
		if (checkTime(DAY, tmPtr->tm_mday) == -1) {
		    *cp1 = '/';
		    return -1;
                }
	    }
	    else if (endTime) {
		m = tmPtr->tm_mon;
		if ((m==1) || (m==3) || (m==5) || (m==7) ||
		    (m==8) || (m==10) || (m==12))
		    tmPtr->tm_mday = 31;
                else if (m != 2)
		    tmPtr->tm_mday = 30;
                else if (tmPtr->tm_year%4 == 0)
		    tmPtr->tm_mday = 29;
                else
		    tmPtr->tm_mday = 28;
            }
	    else
		tmPtr->tm_mday = 1;
        }

	*cp1 = '/';
	tmPtr->tm_mon--;
	tmPtr->tm_hour = ( endTime ? 23 : 0 );
	tmPtr->tm_min = ( endTime ? 59 : 0 );
        tmPtr->tm_sec = ( endTime ? 59 : 0 );
	if (flag == 'w') {
	    if ((ptimef & YEAR) == YEAR) {
	        lserrno = LSE_BAD_TIME;
	        return -1;
            }
	    if ((ptimef & MONTH) == MONTH)
	        tmPtr->tm_year--;
            if ((ptimef & DAY) == DAY)
	        tmPtr->tm_year -= 2;
        }
	*Ptime = mkTime (tmPtr, ptimef, sbtime);
	if (*Ptime < 0)
	    return -1;
	return 0;
    }

    if ((cp == NULL) && (cp1 == toptarg) && (cp2 != NULL) ) {
	*cp2 = '\000';
	cp2 = NULL;
    }
    if ((cp == NULL) && (cp1 == toptarg) && (cp2 == NULL)) {
	ptimef |= DAY;
	toptarg += 1;
	cp1 = NULL;
    }
    if ((cp == NULL) && (cp1  == NULL)) {
	ptimef |= DAY;
	tmPtr->tm_mday = atoi(toptarg);
	if (checkTime(DAY, tmPtr->tm_mday) == -1)
	    return -1;
	tmPtr->tm_hour = ( endTime ? 23 : 0 );
	tmPtr->tm_min = ( endTime ? 59 : 0 );
        tmPtr->tm_sec = ( endTime ? 59 : 0 );
	if (flag == 'w') {
	    if ((ptimef & YEAR) == YEAR) {
	        lserrno = LSE_BAD_TIME;
	        return -1;
            }
	    if ((ptimef & MONTH) == MONTH)
	        tmPtr->tm_year--;
            if ((ptimef & DAY) == DAY)
	        tmPtr->tm_year -= 2;
        }
	*Ptime = mkTime (tmPtr, ptimef, sbtime);
        if (*Ptime < 0)
            return -1;
	return 0;
    }

    if ( (cp == NULL) && (cp2 != NULL) && (cp1 != toptarg) ) {
	if ((cp3 != NULL) || (*(cp2+1) != '\000')) {
	    ptimef |= YEAR;
	    ptimef |= MONTH;
	    ptimef |= DAY;
	    *cp1 = '\000';
	    tmPtr->tm_year = atoi(toptarg);
	    if (checkYear(&tmPtr->tm_year) == -1) {
		*cp1 = '/';
		return -1;
            }
	    *cp1 = '/';
	    *cp2 = '\000';
	    tmPtr->tm_mon = atoi(cp1 + 1);
	    *cp2 = '/';
	    if (cp3 != NULL) {
		*cp3 = '\000';
		tmPtr->tm_mday = atoi(cp2 + 1);
		*cp3 = '/';
            }
	    else
		tmPtr->tm_mday = atoi(cp2 + 1);
            if (checkTime(DAY, tmPtr->tm_mday) == -1)
		return -1;
        }
	else {
	    *cp1 = '\000';
	    tempInt = atoi(toptarg);
	    if (tempInt > 12) {
		ptimef |= YEAR;
                tmPtr->tm_year = tempInt;
		if (checkYear(&tmPtr->tm_year) == -1) {
		    *cp1 = '/';
		    return -1;
                }
		ptimef |= MONTH;
		*cp2 = '\000';
		tmPtr->tm_mon = atoi(cp1+1);
		if (endTime) {
		    m = tmPtr->tm_mon;
		    if ((m==1) || (m==3) || (m==5) || (m==7) ||
			(m==8) || (m==10) || (m==12))
			tmPtr->tm_mday = 31;
                    else if (m != 2)
			tmPtr->tm_mday = 30;
                    else if (tmPtr->tm_year%4 == 0)
			tmPtr->tm_mday = 29;
                    else
			tmPtr->tm_mday = 28;
                }
		else
		    tmPtr->tm_mday = 1;
            }
	    else {
	        ptimef |= MONTH;
		tmPtr->tm_mon = tempInt;
	        ptimef |= DAY;
	        *cp2 = '\000';
	        tmPtr->tm_mday = atoi(cp1+1);
            }
	    if (checkTime(DAY, tmPtr->tm_mday) == -1) {
		*cp1 = '/';
		*cp2 = '/';
                return -1;
	    }
        }
	if (checkTime(MONTH, tmPtr->tm_mon) == -1)
	    return -1;
        tmPtr->tm_mon--;
	*cp1 = '/';
	*cp2 = '/';
	tmPtr->tm_hour = ( endTime ? 23 : 0 );
	tmPtr->tm_min = ( endTime ? 59 : 0 );
        tmPtr->tm_sec = ( endTime ? 59 : 0 );
	if (flag == 'w') {
	    if ((ptimef & YEAR) == YEAR) {
	        lserrno = LSE_BAD_TIME;
	        return -1;
            }
	    if ((ptimef & MONTH) == MONTH)
	        tmPtr->tm_year--;
            if ((ptimef & DAY) == DAY)
	        tmPtr->tm_year -= 2;
        }
	*Ptime = mkTime (tmPtr,ptimef, sbtime);
        if (*Ptime < 0)
            return -1;
	return 0;
    }

    if ( (cp !=NULL) && (cp2 != NULL) && (cp3 != NULL) ) {

	if (cp3 != NULL) {
	    ptimef |= YEAR;
	    ptimef |= MONTH;
	    ptimef |= DAY;
	    *cp1 = '\000';
	    tmPtr->tm_year = atoi(toptarg);
	    *cp1 = '/';
	    if (checkYear(&tmPtr->tm_year) == -1)
		return -1;
            *cp2 = '\000';
	    tmPtr->tm_mon = atoi(cp1+1);
	    *cp2 = '/';
	    if (checkTime(MONTH, tmPtr->tm_mon) == -1)
		return -1;
            tmPtr->tm_mon--;
	    *cp3 = '\000';
	    tmPtr->tm_mday = atoi(cp2+1);
	    *cp3 = '/';
	    if (checkTime(DAY, tmPtr->tm_mday) == -1)
		return -1;
            *cp  = '\000';
	    tmPtr->tm_hour = atoi(cp3+1);
	    *cp  = ':';
	    if (checkTime(HOUR, tmPtr->tm_hour) == -1)
		return -1;
	    if (*(cp+1) != '\000') {
	        tmPtr->tm_min  = atoi(cp+1);
		if (checkTime(MINU, tmPtr->tm_min) == -1)
		    return -1;
            }
            else {
		tmPtr->tm_min = ( endTime ? 59 : 0 );
                tmPtr->tm_sec = ( endTime ? 59 : 0 );
            }
	    if (flag == 'w') {
		if ((ptimef & YEAR) == YEAR) {
		    lserrno = LSE_BAD_TIME;
		    return -1;
                }
		if ((ptimef & MONTH) == MONTH)
		    tmPtr->tm_year--;
                if ((ptimef & DAY) == DAY)
		    tmPtr->tm_year -= 2;
            }
	    *Ptime = mkTime (tmPtr, ptimef, sbtime);
            if (*Ptime < 0)
                return -1;
	    return 0;
        }
    }

    if ( (cp !=NULL) && (cp2 != NULL) && (cp3 == NULL) ) {

	if ( cp1 > toptarg ) {
	    ptimef |= MONTH;
	    *cp1 = '\000';
	    tmPtr->tm_mon = atoi(toptarg);
	    *cp1 = '/';
	    if (checkTime(MONTH, tmPtr->tm_mon) == -1)
		return -1;
	    tmPtr->tm_mon--;
	    toptarg = cp1;
	}
	if ( toptarg[0] == '/' ) {
	    toptarg +=1;
	}
	cp1 = cp2;
	cp2 = NULL;
    }
    if ( (cp !=NULL) && (cp1 != NULL) && (cp2 == NULL) ) {
	if ( (cp1 > toptarg) && (cp1 < cp) ) {
	    ptimef |= DAY;
	    *cp1 = '\000';
	    tmPtr->tm_mday = atoi(toptarg);
	    *cp1 = '/';
	    if (checkTime(DAY, tmPtr->tm_mday) == -1)
		return -1;
	    toptarg = cp1+1;
        } else if (cp1 > cp) {
            lserrno = LSE_BAD_TIME;
            return -1;
	}
    }



    checkThree (toptarg, '/', &cp1, &cp2, &cp3);
    if ( (cp != NULL) && (cp1 == toptarg) && (cp2 == NULL)) {
	toptarg +=1;
    }



    if ( toptarg[0] == ':' ) {
	ptimef |= MINU;
	tmPtr->tm_min = atoi(cp+1);
	if (checkTime(MINU, tmPtr->tm_min) == -1)
	    return -1;

	if (flag == 'w') {
	    if ((ptimef & YEAR) == YEAR) {
	        lserrno = LSE_BAD_TIME;
	        return -1;
            }
	    if ((ptimef & MONTH) == MONTH)
	        tmPtr->tm_year--;
            if ((ptimef & DAY) == DAY)
	        tmPtr->tm_year -= 2;
        }
	*Ptime = mkTime (tmPtr, ptimef, sbtime);
        if (*Ptime < 0)
            return -1;
	return 0;
    }
    ptimef |= HOUR;
    if ( *(cp+1) != '\000') {
	ptimef |= MINU;
	tmPtr->tm_min = atoi(cp+1);
	if (checkTime(MINU, tmPtr->tm_min) == -1)
	    return -1;
    } else
	tmPtr->tm_min = ( endTime ? 59 : 0 );
    *cp = '\000';
    tmPtr->tm_hour = atoi(toptarg);
    if (checkTime(HOUR, tmPtr->tm_hour) == -1) {
	*cp = ':';
	return -1;
    }
    *cp = ':';
	if (flag == 'w') {
	    if ((ptimef & YEAR) == YEAR) {
	        lserrno = LSE_BAD_TIME;
	        return -1;
            }
	    if ((ptimef & MONTH) == MONTH)
	        tmPtr->tm_year--;
            if ((ptimef & DAY) == DAY)
	        tmPtr->tm_year -= 2;
        }
    *Ptime = mkTime (tmPtr, ptimef, sbtime);
    if (*Ptime < 0)
        return -1;
    return 0;

}