CF212DIV2
A题:
题目呢连接:http://codeforces.com/contest/362/problem/A。
刚开始想用DFS搜索,但是忘记了:可以move through"#"这个条件!就是说可以走到"#"(很关键),但不能在这里相聚!
直接委掉了!
先贴下DFS的代码写的很垃圾!
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 5 int x[4]={-2,2,-2,2}; 6 int y[4]={-2,-2,2,2}; 7 8 int t; 9 char s[10][10]; 10 int v[10][10],b[10][10]; 11 void visit(int xx,int yy) 12 { 13 for (int i=0;i<=3;i++) 14 { 15 if (xx+x[i]>=1&&yy+y[i]>=1&&xx+x[i]<=8&&yy+y[i]<=8&&!b[xx+x[i]][yy+y[i]]) 16 { 17 // if (s[xx+x[i]][yy+y[i]]!='#') 18 //所以省掉了这句 { 19 v[xx+x[i]][yy+y[i]]=v[xx][yy]+1; 20 b[xx+x[i]][yy+y[i]]=1; 21 visit(xx+x[i],yy+y[i]); 22 //} 23 } 24 } 25 } 26 int main() 27 { 28 scanf("%d",&t); 29 while (t--) 30 { 31 // getchar(); 32 int x1=0,x2=0,y1=0,y2=0; 33 memset(v,0,sizeof(v)); 34 memset(b,0,sizeof(b)); 35 for (int i=1;i<=8;i++) 36 { 37 scanf("%s",s[i]); 38 for (int j=8;j>=1;j--) 39 s[i][j]=s[i][j-1]; 40 for (int j=1;j<=8;j++) 41 { 42 if (s[i][j]=='K') 43 { 44 if (x1==0&&y1==0) 45 { 46 x1=i;y1=j; 47 48 b[i][j]=1; 49 } 50 else 51 { 52 x2=i;y2=j; 53 } 54 } 55 } 56 } 57 visit(x1,y1); 58 if (v[x2][y2]%2==0&&v[x2][y2])// 59 printf("YES\n"); 60 else printf("NO\n"); 61 62 63 64 } 65 return 0; 66 }
PS:题目说两个一起走!可以归纳为:A走到B点,但是经过的点数要是偶数点!(不包括A点)
比如:1—>2—>3,走了2,3点!其实正常理解的是1-》2,3->2。
如果是1-》2-》3-》4,是不能满足的!代码很委,假如有读者看的话,就凑合着看吧!
还有一种数学方法是K1(X1,Y1),K2(X2,Y2);)
因为棋盘很小8*8;如果(x1-x2)%4==0&&(y1-y2)%4==0就可以到达!
原理可以画:8*8的棋盘.也是和上一题的解法!要过偶数点!
不用暴力!
B:http://codeforces.com/contest/362/problem/B
很简单!
代码:不解释了!
随性Code