今天训练的题目,当时CFOJ挂了,没有显示结果,结果是WA了。
做得很着急,用广搜做。其实题目还不是很明白的
最后结束的时候看了一下别人博客的题解的意思,瞬间明白了
题意:同时移动两个'K'点,问两个点最终能不能相遇。
总结:
1.没看清楚题目就做了,心态不稳定,太着急了。当时第一名交了这题,我的上一题才3A
2.题目中的'#'好像是坑爹陷阱的,没什么用,看清楚题目最重要。
3.细心点很快就找到规律。其实田字走法加上一个8*8的地域限制,绝对找到了可解决点。
4.用广搜的方法做,过不了7个测试数据,当然我的求解的目的已经错了。
5.只要两个点的横纵坐标的距离满足关系就可以知道了。详见代码
1 #include <stdio.h> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 6 int main() 7 { 8 int T; 9 scanf("%d",&T); 10 while(T--) 11 { 12 int x1,x2,y1,y2,cur=0; 13 char s[10]; 14 for(int i=0;i<8;i++){ 15 scanf("%s",s); 16 for(int j=0;j<8;j++){ 17 if(s[j]=='K'){ 18 if(cur) x2=i,y2=j; 19 else x1=i,y1=j,cur=1; 20 } 21 } 22 } 23 printf((abs(x1-x2)%4==0&&abs(y1-y2)%4==0)?"YES ":"NO "); 24 } 25 return 0; 26 }
其实搜索才是最强大的,不过这道题还是用规律比较好解决,刚刚写了一个深搜1Y了贴贴代码先
#include <stdio.h> #include <string.h> const int dx[] = {2,-2,2,-2}; const int dy[] = {-2,2,2,-2}; int vis[10][10] , flag = 0; int x1,x2,y1,y2; bool is_not(int x ,int y) { return (x<0||x>7||y<0||y>7); } void dfs(int x,int y,int z) { //printf("%d %d ",x,y); if(x == x2 && y == y2 && z%2 == 0) { flag=1; return; } for(int i=0;i<4;i++){ int nx = x + dx[i] , ny = y + dy[i]; if(is_not(nx,ny) || vis[nx][ny]) continue; vis[nx][ny] = 1; dfs(nx,ny,z+1); } } int main() { int T; scanf("%d",&T); while(T--) { flag = 0; int cur = 0; for(int i=0;i<8;i++) { char s[100]; scanf("%s",s); for(int j=0;j<8;j++) { if(s[j] == 'K'){ if(!cur) x1=i,y1=j,cur++; else x2=i,y2=j; } } } memset(vis,0,sizeof(vis)); dfs(x1,y1,0); if(flag == 1) puts("YES"); else puts("NO"); } return 0; } /* 3 ........ ........ ......#. K..##..# .......# ...##..# ......#. K....... ........ ........ ..#..... ..#..#.. ..####.. ...##... ........ ....K#K# */
训练的时候,我是用两点搜索来做的,也就是暴力求出它们的移动路径的解,然后暴力对比这些值看能不能达到要求
可惜是wa的代码,调了一个上午的代码,死活过不了样例7,mark一个。
其实深搜的代码相当简洁,如果每个搜索的节点都只被搜过一次,时间复杂度并没有那么恐怖,学会深搜是基本。