Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

【大模拟】终于ac了,干干干!!!

Posted by WilliamACM at 2013-04-23 19:57:26 on Problem 4001
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node
{
    int kind,x,y,can;
}a[8];
int x,y,n,tu[12][12];
int mx[4]={0,0,1,-1};
int my[4]={1,-1,0,0};
bool in(int x,int y)
{
    if(x<=0||y<=0||x>10||y>9) return 0;
    return 1;
}
bool check(int aim_x,int aim_y)
{
    for(int i=1;i<=n;i++)
    if(a[i].can)
    {
        int x=a[i].x,y=a[i].y;
//        printf("%d %d %d\n",a[i].kind,x,y);
        switch(a[i].kind)
        {
            case 1:
            {
                if(aim_y!=y) break;
                int wr=0;
                for(int i=aim_x+1;i<x;i++)
                {
//                    printf("%d %")
                    if(tu[i][y]) wr=1;
                }
                if(wr) break;
//                printf("1:\n");
                return 0;
            }
            case 2:
            {
                for(int i=0;i<4;i++)
                {
                    int tx=x+mx[i];
                    int ty=y+my[i];
                    while(in(tx,ty)&&tu[tx][ty]==0)
                    {
//                        printf("2:%d %d\n",tx,ty);
                        if(tx==aim_x&&ty==aim_y) return 0;
                        tx+=mx[i];
                        ty+=my[i];
                    }
                }
                break;
            }
            case 3:
            {
                for(int i=0;i<4;i++)
                {
                    int tx=x+mx[i];
                    int ty=y+my[i];
                    while(in(tx,ty)&&tu[tx][ty]==0)
                    {
                        tx+=mx[i];
                        ty+=my[i];
                    }
                    if(tu[tx][ty])
                    {
                        tx+=mx[i];
                        ty+=my[i];
                        while(in(tx,ty)&&tu[tx][ty]==0)
                        {
//                            printf("3: %d %d\n",tx,ty);
                            if(tx==aim_x&&ty==aim_y) return 0;
                            tx+=mx[i];
                            ty+=my[i];
                        }
                    }
                }
                break;
            }
            case 4:
            {
                for(int i=0;i<4;i++)
                {
                    int tx=x+mx[i];
                    int ty=y+my[i];
                    if(!in(tx,ty)||tu[tx][ty]) continue;
                    int ux=abs(mx[i])^1;
                    int uy=abs(my[i])^1;
                    int nx=tx+mx[i]+ux;
                    int ny=ty+my[i]+uy;
//                    printf("4: %d %d\n",nx,ny);
                    if(nx==aim_x&&ny==aim_y) return 0;
                    nx-=ux<<1;
                    ny-=uy<<1;
//                    printf("4: %d %d\n",nx,ny);
                    if(nx==aim_x&&ny==aim_y) return 0;
                }
                break;
            }
        }
    }
    return 1;
}
int main()
{
   // freopen("in.txt","r",stdin);
    while(scanf("%d%d%d",&n,&x,&y),!(n==0&&x==0&&y==0))
    {
        memset(tu,0,sizeof(tu));
        for(int i=1;i<=n;i++)
        {
            char s[10];
            scanf("%s%d%d",s,&a[i].x,&a[i].y);
            a[i].can=1;
            if(s[0]=='G') a[i].kind=1;
            else
            if(s[0]=='R')a[i].kind=2;
            else
            if(s[0]=='C') a[i].kind=3;
            else a[i].kind=4;
            tu[a[i].x][a[i].y]=i;
        }
        bool ans=1;
        if(check(x,y)) ans=0;
        for(int i=0;i<4;i++)
        {
            int nx=x+mx[i];
            int ny=y+my[i];
            //f(!in(nx,ny)) continue;
            if(ny<4||ny>6||nx<1||nx>3) continue;
//            printf("***%d %d***\n",nx,ny);
            int mark=tu[nx][ny];
            tu[nx][ny]=0;
            a[mark].can=0;
            if(check(nx,ny)) {ans=0;break;}
            a[mark].can=1;
            tu[nx][ny]=mark;
        }
        printf("%s\n",ans?"YES":"NO");
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator