银河之星(galaxy)

当时没来的及做,应该是一道不是太难的搜索题。

首先,可以想到可行解的数量一定远远少于不可行解的数量;

与其我们直接搜索,倒不如我们根据(x,y)构造可行解,然后判断。

代码实现:

 1 #include<map>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 typedef long long LL;
 6 const int dx[8] = {0,1,0,-1,1,-1,1,-1};
 7 const int dy[8] = {1,0,-1,0,1,-1,-1,1};
 8 const int ch[9][9] = {{0,2,1,6,8,7,3,5,4},{2,1,0,8,7,6,5,4,3},{1,0,2,7,6,8,4,3,5},
 9                       {6,8,7,3,5,4,0,2,1},{8,7,6,5,4,3,2,1,0},{7,6,8,4,3,5,1,0,2},
10                       {3,5,4,0,2,1,6,8,7},{5,4,3,2,1,0,8,7,6},{4,3,5,1,0,2,7,6,8}};
11 map <LL,int> ma;
12 int n,m,k,X,Y,p[10][10],x[10],y[10];
13 LL now,goal,fac[10],che[10];
14 inline int ABS(int x) {return x < 0?-x:x;}
15 void Add(int X1,int Y1,int X2,int Y2){
16     int A=3*(X1%3)+Y1%3;
17     int B=3*(X2%3)+Y2%3;
18     p[A][B]=p[B][A]=1;
19 }
20 void Work(int a,int b){
21     for (int l=0;l<8;l++){
22         int xa=a+dx[l]*3;
23         int yb=b+dy[l]*3;
24         if(xa<1||xa>n||yb<1||yb>m) continue;
25         for(int i=0;i<8;i++){
26             int xx=xa+dx[i];
27             int yy=yb+dy[i];
28             if(xx<1||xx>n||yy<1||yy>m) continue;
29             Add(a,b,xx,yy);
30         }
31     }
32     for (int i=0;i<8;i++){
33         int xx=a+dx[i],yy=b+dy[i];
34            if(xx<1||xx>n||yy<1||yy>m) continue;
35            Add(a,b,xx,yy);
36     }
37 }
38 bool dfs(LL now,int tot){
39     if (now == goal) return 1;
40     if (ma[now]) return 0;
41     else ma[now] = 1;
42     if (tot == 1) return 0;
43     for (int i = 0; i < 9; i++)
44         for (int j = i + 1; j < 9; j++)
45             if (p[i][j] && che[i] && che[j]) {
46                 --che[i]; --che[j]; ++che[ch[i][j]];
47                 LL nex = 0;
48                 for (int l = 0; l < 9; l++) nex += fac[l]*che[l];
49                 if (dfs(nex,tot-1)) return 1;
50                 ++che[i]; ++che[j]; --che[ch[i][j]];
51             }
52     return 0;
53 }
54 int main(){
55     #ifdef YZY
56            freopen("galaxy4.in","r",stdin);
57     #endif
58     fac[0] = 1;
59     for (int i = 1; i < 10; i++) fac[i] = fac[i-1]*11LL;
60     while (scanf("%d%d%d%d%d",&k,&n,&m,&X,&Y) != EOF) {
61         memset(p,0,sizeof(p)); memset(che,0,sizeof(che)); ma.clear();
62         goal = fac[3*(X%3) + Y%3];
63         for (int i = 0; i < k; i++) {
64             scanf("%d%d",&x[i],&y[i]);
65             ++che[3*(x[i]%3) + y[i]%3];
66         }
67         for (int i = 1; i <= n; i++)
68             for (int j = 1; j <= m; j++)
69                 Work(i,j);
70         LL st = 0;
71         for (int i = 0; i < 9; i++) st += che[i]*fac[i];
72         if (dfs(st,k)) printf("Yes\n");
73         else printf("No\n");
74     }
75     return 0;
76 }

题目来源:Pku 3490

时间: 2024-10-05 16:44:56

银河之星(galaxy)的相关文章

银河之星 (乱搞+记忆化搜索)

Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 乍一看真的无从下手,规则一脸懵逼. 首先看到第3个规则,每个棋子往任意方向都只能走3格.可以联想一下国际象棋四个象,2个永远在黑格,2个永远在白格. 依照这个思路,我们只有9类位置(横坐标模3与纵坐标模3都相同的位置为同一类). 其中,每一类位置上的棋子可以通过规则3互达同一类位置,却永远不可能用规则3走到其他类的位置. 如下图:(想象若干个3x3的框,左上角对齐铺满整个地图,框内

2017清北精英班整理内容掌握考试题

精英班考试题 2017.2.10 题目名 工资 藏妹子之处 银河之星 源文件 money.cpp/c/pas excel.pas/cpp galaxy.cpp/c/pas 输入文件 money.in excel.in galaxy.in 输出文件 money.out excel.out galaxy.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 128MB 256MB 测试点 10 10 10 测试点分值 10 10 10 第一题 工资 链接 第二题  藏妹子

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

佳市党校

自传30.在佳木斯市委党校一----优秀教师 一九八五年九月我在佳木斯市委党校经济学教研室工作第一学年.珍香在交通局医院当会计工作顺利心情很好工资福利待遇较一般.儿子在七中上高中二年级当班长与班主任老师关系密切成为好友.女儿在五中上初中二年级当课代表学习成绩排前列深得老师喜欢. 上学期我课哲学80学时商业班国民经济管理概论450学时党政班.计划经济概论120学时电大统计班政治经济学60学时省校函授班.本学期开始将地市合并初我的教研室负责人职务正式定为副主任.九月十日第一个教师节我荣获省市优秀教师

NOI2002_ Galaxy银河英雄传说86

公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多:然而,老谋深算的莱因哈特早已在战略上取得了主动:在杨威利发布指令调动舰队的同时,莱因哈特为了及时:作为一个资深的高级程序设计员,你被要求编写程序分:输入文件:第一行有一个整数t(1?t?500,000),表:m 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年

[noi2002]银河英雄传说

Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.        宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌.        杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 3000

上方谷司马受困 五丈原诸葛禳星

却说司马懿被张翼.廖化一阵杀败,匹马单枪,望密林间而走.张翼收住后军,廖化当先追赶.看看赶上,懿着慌,绕树而转.化一刀砍去,正砍在树上:及拔出刀时,懿已走出林外.廖化随后赶出,却不知去向,但见树林之东,落下金盔一个.廖化取盔捎在马上,一直望东追赶.原来司马懿把金盔弃于林东,却反向西走去了.廖化追了一程,不见踪迹,奔出谷口,遇见姜维,同回寨见孔明.张嶷早驱木牛流马到寨,交割已毕,获粮万余石.廖化献上金盔,录为头功.魏延心中不悦,口出怨言.孔明只做不知. 且说司马懿逃回寨中,心甚恼闷.忽使命赍诏至,

银河英雄传说

题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, -,30000.之后,他把自己的战舰也依次编号为1, 2,

数据结构(并查集):260. [NOI2002] 银河英雄传说

260. [NOI2002] 银河英雄传说 ★★☆   输入文件:galaxy.in   输出文件:galaxy.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布