码迷,mamicode.com
首页 > 其他好文 > 详细

2013_HangZhou_Online

时间:2014-08-29 09:29:27      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:online   sum   

这个专题充分暴露了不认真思考的缺点,总是感觉差不多就下手。

对于A题目,以为是强连通分量缩点。但实际上是求桥。

并考虑:1.重边 2.权重为0则初始值不能赋值为0,当选取权重为0的边答案为1  3.没有答案。

对于B题目,起初想得很复杂,以为是动态规划,一直在思考转移方程。但其实DFS就可以,但漏掉了形成正方形的另一个条件,底边平行。

对于C题目,这里又出现了漏洞(直接DFS不用考虑这些)就是停止的情况用循环写要格外考虑。可我却模拟做,用循环来写。

这里还自己编了点数据。

/*
4
0 3 1
0 0 3
4
0 2 1
0 3 0
4
0 3 3
0 0 3
4
0 3 3
0 0 0 
4
0 3 3
1 3 1
4
0 0 0
0 3 1

*/#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#define maxn 1005
using namespace std;
int N,M;
int lr,lc,ld,tr,tc,td;
int direct[4][2]={0,1, 1,0, 0,-1, -1,0};
struct point
{
    int lt,tt;
}P[maxn][maxn];
int main()
{
    int i,j,k;
    int flag;
    while(scanf("%d",&N))
    {
        if(N==0)
            break;
        scanf("%d%d%d%d%d%d",&lr,&lc,&ld,&tr,&tc,&td);
        if(lr==tr&&lc==tc)
        {
            printf("%d %d\n",lr,lc);
            continue;
        }
        memset(P,-1,sizeof(P));
        k=1;    P[lr][lc].lt=k++;
        while(1)
        {        
            while(1)
            {                
                if(lr+direct[ld][0]<0 || lr+direct[ld][0]>=N || lc+direct[ld][1]<0 || lc+direct[ld][1]>=N || P[ lr+direct[ld][0] ][ lc+direct[ld][1] ].lt!=-1)
                    break;
                lr+=direct[ld][0];lc+=direct[ld][1];
                P[lr][lc].lt=k++;            
            }        
            ld++;
            ld%=4;
                if(lr+direct[ld][0]<0 || lr+direct[ld][0]>=N || lc+direct[ld][1]<0 || lc+direct[ld][1]>=N || P[ lr+direct[ld][0] ][ lc+direct[ld][1] ].lt!=-1)
                    break;
        }
        /*for(i=0;i<N;i++)
        {for(j=0;j<N;j++)
        printf("%2d ",P[i][j].lt);
        printf("\n");}*/
        j=1;P[tr][tc].tt=j++;    
        flag=0;
        while(1)
        {
            while(1)
            {
                if(tr+direct[td][0]<0 || tr+direct[td][0]>=N || tc+direct[td][1]<0 || tc+direct[td][1]>=N || P[ tr+direct[td][0] ][ tc+direct[td][1] ].tt!=-1)
                    break;
                tr+=direct[td][0];tc+=direct[td][1];
                P[tr][tc].tt=j++;
                if(P[tr][tc].lt==P[tr][tc].tt || (P[lr][lc].lt<P[lr][lc].tt))
                {
                    flag=1;break;
                }
				//if(j>=k)break;
                
            }
			//if(j>=k)break;
            if(flag==1) break;            
            td+=3;
            td%=4;
                if(tr+direct[td][0]<0 || tr+direct[td][0]>=N || tc+direct[td][1]<0 || tc+direct[td][1]>=N || P[ tr+direct[td][0] ][ tc+direct[td][1] ].tt!=-1)
                    break;
                
        }
		if(P[tr][tc].lt>=P[tr][tc].tt)
			printf("%d %d\n",tr,tc);
        else if(flag==0)
            printf("-1\n");
        else
            printf("%d %d\n",tr,tc);
    }
    return 0;
}

ALL in all,下次写题目先把情况考虑周全。问题建模正确再开始。特殊数据自己要先构建出来。

尤其是为0,重点,等

2013_HangZhou_Online

标签:online   sum   

原文地址:http://blog.csdn.net/gg_gogoing/article/details/38919473

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!