csuoj 1511: 残缺的棋盘

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511

1511: 残缺的棋盘

时间限制: 1 Sec  内存限制: 128 MB

题目描述

输入

输入包含不超过10000 组数据。每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同。

输出

对于每组数据,输出测试点编号和最少步数。

样例输入

1 1 8 7 5 6
1 1 3 3 2 2

样例输出

Case 1: 7
Case 2: 3

提示

来源

湖南省第十届大学生计算机程序设计竞赛

分析:

8 x 8 的棋盘,BFS搜索可以解决,一开始队友写错了条件导致TLE , 后来又写了一个笛卡尔坐标模拟的,但是pc^2判错啦 , 后来在csuoj上提交也是错的,对照数据没有发现错误,真是无语啦,把其他队的AC代码提交到csuoj上也是WA,真是服了,但是搜索做的都过啦,,,orz

AC代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<stack>
 6 #include<queue>
 7 #include<map>
 8 #include<set>
 9 #include<string.h>
10 #define ll long long
11 #define oo 1000007
12 #define pi acos(-1.0)
13 #define MAXN 500005
14 using namespace std;
15 struct node
16 {
17       int x,y,k;
18 }h,p;
19 int m,n,k,ex,ey,num[105][105][1005];
20 bool used[105][105][1005];
21 queue<node> myqueue;
22 int main()
23 {
24       while (~scanf("%d%d%d%d%d%d%d",&n,&m,&h.x,&h.y,&ex,&ey,&k))
25       {
26              while (!myqueue.empty()) myqueue.pop();
27              h.k=0;
28              myqueue.push(h);
29              memset(num,0,sizeof(num));
30              memset(used,false,sizeof(used));
31              used[h.y][h.x][0]=true;
32              num[h.y][h.x][0]=1;
33              while (!myqueue.empty())
34              {
35                    h=myqueue.front();
36                    myqueue.pop();
37                    if (h.k==k) continue;
38                    if (h.y+1<=m)
39                    {
40                          p.x=h.x,p.y=h.y+1,p.k=h.k+1;
41                          if (!used[p.y][p.x][p.k]) myqueue.push(p),used[p.y][p.x][p.k]=true;
42                          num[p.y][p.x][p.k]=(num[p.y][p.x][p.k]+num[h.y][h.x][h.k])%oo;
43                    }
44                    if (h.x-1>=1)
45                    {
46                          p.x=h.x-1,p.y=h.y,p.k=h.k+1;
47                          if (!used[p.y][p.x][p.k]) myqueue.push(p),used[p.y][p.x][p.k]=true;
48                          num[p.y][p.x][p.k]=(num[p.y][p.x][p.k]+num[h.y][h.x][h.k])%oo;
49                    }
50                    if (h.x+1<=n)
51                    {
52                          p.x=h.x+1,p.y=h.y,p.k=h.k+1;
53                          if (!used[p.y][p.x][p.k]) myqueue.push(p),used[p.y][p.x][p.k]=true;
54                          num[p.y][p.x][p.k]=(num[p.y][p.x][p.k]+num[h.y][h.x][h.k])%oo;
55                    }
56              }
57              printf("%d\n",num[ey][ex][k]);
58       }
59       return 0;
60 }

数组模拟:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 #include<iostream>
 6 #include<stack>
 7 #include<map>
 8 #include <math.h>
 9 #include<string>
10
11 using namespace std;
12
13 double area(double x1 , double y1 , double x2 , double y2 , double x3 , double y3)
14     {return x1 * y2 + x3 * y1 + x2 * y3 - x3 * y2 - x1 * y3 - x2 * y1 ;}
15
16 int main()
17 {
18     //freopen("i.in" , "r" , stdin);
19     //freopen("o.out" , "w" , stdout);
20     int x1 , x2 , x3 , y1 , y2 , y3 , first = 1;
21     while(~scanf("%d %d %d %d %d %d" , &x1 ,&y1 , &x2 , &y2 , &x3 , &y3))
22     if(!area(x1 , y1 , x2 , y2 , x3 , y3) && !( ((x1 == x2) && (x2 == x3) && (x1 == x3)) || (y1 == y2 && y1 == y3 && y2 == y3))
23         && ( (x3 > x1 && x3 < x2) || (x3 > x2 && x3 < x1))    )
24         printf("Case %d: %.0lf\n" , first ++ , max(fabs(x1 - x2) , fabs(y1 - y2)) + 1 ) ;
25     else
26         printf("Case %d: %.0lf\n" , first ++ , max(fabs(x1 - x2) , fabs(y1 - y2)) ) ;
27     return 0;
28 }

其他队的:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5
 6 int main()
 7 {
 8     int x1, y1, x2, y2, x3, y3, cnt = 0;
 9     while(scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3) != EOF)
10     {
11         int res = abs(x2 - x1) > abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1);
12
13         if((x3 >= x1 && x3 <= x2) || (x3 <= x1 && x3 >= x2))
14         {
15                if((y1 - x1 == y2 -x2 && y1 - x1 == y3 - x3) ||(x1 + y1 == x2 + y2 && x1 + y1 == x3 + y3) || (x1 == x2 && x1 == x3) || (y1 == y2 && y1 == y3))

16                       res++;
17         }
18         printf("Case %d: %d\n", ++cnt, res);
19     }
20 }

官方标程:

 1 // Rujia Liu
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6
 7 #define dist(a,b) (max(abs(r[a]-r[b]),abs(c[a]-c[b])))
 8
 9 int main() {
10   int r[3], c[3], kase = 0;
11   while(cin>>r[0]>>c[0]>>r[1]>>c[1]>>r[2]>>c[2]) {
12     int dr = abs(r[0]-r[1]);
13     int dc = abs(c[0]-c[1]);
14     int d = max(dr, dc);
15     if(dr == dc && dist(0,1) == dist(0,2) + dist(2,1)) d++;
16     printf("Case %d: %d\n", ++kase, d);
17   }
18   return 0;
19 }

时间: 2024-10-10 17:40:25

csuoj 1511: 残缺的棋盘的相关文章

CSU 1511 残缺的棋盘

1511: 残缺的棋盘 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 169  Solved: 56 [Submit][Status][Web Board] Description Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数

CSU 1511: 残缺的棋盘(BFS啊 )

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 Description Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数. Sample Input 1 1 8 7 5 6 1 1 3 3 2 2 Sample

CSU 1511 残缺的棋盘 第十届湖南省赛题

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 题目大意:在一个8*8的棋盘中,给你一个起点位置和一个终点位置,同时也给你一个陷阱位置,问你从起点绕过陷阱到终点的最短距离.(可以上下左右走还可以斜走) 解题思路:可以直接用搜索,也可以用数学知识来解决,我们之前学过,两点之间直接最短,所以当陷阱不在这条直线上的时候,我们就不用考虑陷阱了,直接是max(abs(x1-y1),abs(x2-y2))最终结果, 但是如果陷阱在两条直线

湖南省第十届大学生计算机程序设计竞赛:残缺的棋盘

1511: 残缺的棋盘 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 169 Solved: 56 [Submit][Status][Web Board]Description] Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数.

CSU 残缺的棋盘 (BFS)

Description Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. Output 对于每组数据,输出测试点编号和最少步数. Sample Input <span class="sampledata">1 1 8 7 5 6 1 1 3 3 2 2</span> Sample Outp

《程序员的数学思维修炼》 读书笔记

电子书定价:     ¥ 45.00       这是什么?                     纸书定价:     ¥ 45.00       Kindle电子书价格:     ¥ 1.99                   为您节省:     ¥ 43.01      (0.4折)            ~ 周颖   等 (作者) 发售日期: 2014年4月1日 本书是一本专门为程序员而写的数学书,介绍了程序设计中常用的数学知识.本书门槛不高,不需要读者精通很多高深的数学知识,只需要读

数学思维修炼

最近想阅读一些数学方面的资料,但是又想和自己的工作联系上,因此就找到了这本<程序员的数学思维修炼(趣味解读)>,下面会对本书的知识点做个梳理. 1.2.6 数的阶乘 1.2.7 大整数 1.3.3 二进制运算 1.3.5 十进制和二进制之间的转换 以基数B再取余的方法 1.4 八进制.十六进制.六十进制 2.1.1 素数 2.1.3 试除法(循环到√n即可),数学家筛选法,Eratosthenes寻找100以内的素数的算法:依次去除2.3.5.7的倍数的整数 2.1.4 素数定理 2.2.2

残缺棋盘

//残缺棋盘的问题要求用3个方格的板(三格板)(triominoes)覆盖残缺棋盘. //在此覆盖中,两个三格板不能重叠,三格板不能覆盖残缺方格,但必须覆盖其他所有的方格. //在这种限制条件下,所需要的三格板总数为(2^(2k-1))/3. //可以验证(2^(2k-1))/3是一个整数.k为0的残缺棋盘很容易被覆盖, //因为它没有非残缺的方格,用于覆盖的三格板的数目为0.当k=1时, //正好存在3个非残缺的方格,并且这三个方格某一方 向的三格板来覆盖. //小残缺棋盘 //  1 //1

残缺棋盘的覆盖问题

棋盘覆盖问题    问题描述: 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘.     下图–图(1)中的特殊棋盘是当k=3时16个特殊棋盘中的一个: 图(1) 题目要求在棋盘覆盖问题中,要用下图-图(2)所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖. 图(2) 题目输入k