http://blog.csdn.net/ld_1090815922/article/details/70550789

来源:互联网 发布:mysql应用 编辑:程序博客网 时间:2024/06/05 11:38

连连看

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34760    Accepted Submission(s): 8645


Problem Description
“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
 

Input
输入数据有多组。每组数据的第一行有两个正整数n,m(0<n<=1000,0<m<1000),分别表示棋盘的行数与列数。在接下来的n行中,每行有m个非负整数描述棋盘的方格分布。0表示这个位置没有棋子,正整数表示棋子的类型。接下来的一行是一个正整数q(0<q<50),表示下面有q次询问。在接下来的q行里,每行有四个正整数x1,y1,x2,y2,表示询问第x1行y1列的棋子与第x2行y2列的棋子能不能消去。n=0,m=0时,输入结束。
注意:询问之间无先后关系,都是针对当前状态的!
 

Output
每一组输入数据对应一行输出。如果能消去则输出"YES",不能则输出"NO"。
 

Sample Input
3 4 1 2 3 4 0 0 0 0 4 3 2 1 4 1 1 3 4 1 1 2 4 1 1 3 3 2 1 2 4 3 4 0 1 4 3 0 2 4 1 0 0 0 0 2 1 1 2 4 1 3 2 3 0 0
 

Sample Output
YES NO NO NO NO YES
 

Author
lwg
 

Recommend
We have carefully selected several similar problems for you:  1180 1072 1026 1242 1253 
 
解题思路:思路应该来说不难,关键是要解决超时问题,看代码注释吧。
代码:
[cpp] view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. #include <cmath>  
  5. using namespace std;  
  6. int mp[1005][1005];  
  7. bool vis[1005][1005];  
  8. int dir[4][2]= {{-1,0},{0,-1},{1,0},{0,1}};  
  9. int n,m;  
  10. int sx,sy,ex,ey;  
  11. bool flag;                             //flag标记是否按要求找到目标棋子  
  12. void dfs(int x,int y,int a,int b)     //x,y表示搜索的坐标,a记录当前搜索方向,b记录拐弯次数  
  13. {  
  14.     int nx,ny,p;                    //p做为转弯次数b的中间变量,直接用b会出错,我也不知道为什么  
  15.     if(b>2||flag)                  //当转弯次数超过2或已找到搜素目标位置就退出,这里很关键,没加这一步我一直超时  
  16.         return;  
  17.     for(int i=0; i<4; i++)  
  18.     {  
  19.         nx=x+dir[i][0];  
  20.         ny=y+dir[i][1];  
  21.         if(vis[nx][ny]&&nx>0&&ny>0&&nx<=n&&ny<=m)  
  22.         {  
  23.             if(a!=i) p=b+1;           //搜索方向与前一方向不一致,转弯次数就加一  
  24.             else p=b;  
  25.             if(nx==ex&&ny==ey&&p<3)  //找到目标位置并拐弯次数少于3  
  26.             {  
  27.                 flag=true;  
  28.                 return ;  
  29.             }  
  30.             if(!mp[nx][ny])  
  31.             {  
  32.                 vis[nx][ny]=false;  
  33.                 dfs(nx,ny,i,p);  
  34.                 vis[nx][ny]=true;  
  35.             }  
  36.             if(flag)            //还是为了及时结束程序运行,节省时间  
  37.             break;  
  38.         }  
  39.     }  
  40. }  
  41. int main()  
  42. {  
  43.     while(~scanf("%d%d",&n,&m)&&(n+m))  
  44.     {  
  45.         int t;  
  46.         memset(mp,1,sizeof(mp));  
  47.         for(int i=1; i<=n; i++)  
  48.             for(int j=1; j<=m; j++)  
  49.                 scanf("%d",&mp[i][j]);  
  50.         scanf("%d",&t);  
  51.         while(t--)  
  52.         {  
  53.             memset(vis,true,sizeof(vis));  
  54.             scanf("%d%d%d%d",&sx,&sy,&ex,&ey);  
  55.             flag=false;  
  56.             if(mp[sx][sy]!=mp[ex][ey]||!mp[ex][ey]||!mp[sx][sy])//判断两个棋子是否一样或是不是为空  
  57.             {  
  58.                 printf("NO\n");  
  59.                 continue;  
  60.             }  
  61.             else  
  62.                 dfs(sx,sy,-1,-1);              //起始方向为-1,因为一开始出发就算是改变的方向,所以拐弯次数从-1开始算才对  
  63.             if(flag)  
  64.                 printf("YES\n");  
  65.             else  
  66.                 printf("NO\n");  
  67.   
  68.         }  
  69.     }  
  70.     return 0;  
  71. }  
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 非工伤单位不支付病假工资怎么办 十个月宝宝咳嗽有痰怎么办崔玉涛 怀孕五个月胎儿脐带绕颈怎么办 6个月宝宝白天睡眠不好怎么办 22个月宝宝身高才79公分怎么办 宝宝十个月了还没长牙怎么办 腰椎间盘突出翻身都困难了怎么办 上课很困怎么办犯困快速清醒的绝招 孩子上小学放学早父母上班怎么办 想玩滑冰鞋的手受伤了怎么办? 美团酒店商家入住没审核通过怎么办 顺丰离职人员被列入黑名单怎么办 洗了衣服晾起来衣服被拉长了怎么办 宝宝拉肚子半个月了还不好怎么办 宝宝咳嗽半个月了还不好怎么办 顾客试了一大堆衣服不买怎么办 宝宝屁屁用尿布捂的红的怎么办? 车被别人撞了人跑了怎么办 在无锡小孩超龄上不了学怎么办 我把共享单车二维码弄坏了怎么办 车里坐垫整上柴油了怎么办 双人骑自行车车坐压往后仰了怎么办 穿高帮钉鞋踢人造草出现水泡怎么办 耐克大吕布鞋面上的标志起来怎么办 国三柴油车环保查尾气超标怎么办 手上被玻璃手上扎进玻璃丝怎么办 月子腰疼怎么办能养过来吗 躺太久屁股长一粒一粒的痒怎么办啊 乳腺癌两年后手臂疼胳膊肿怎么办 胳膊疼就和抻筋是的怎么办 四岁胳膊扭了肿了怎么办 干燥综合症使皮肤变黑色了怎么办 刚生的小孩脖子上有淋巴结怎么办 地包天矫正期间嘴歪了怎么办 5个月的宝宝歪胫怎么办 三个多月的宝宝有点斜颈怎么办 5月宝宝有点斜颈偏向左侧怎么办 外斜术后变周期性内斜怎么办 右腰劳损休息一个多月还痛怎么办 宝宝鼻子不通气用嘴呼吸怎么办 窦性心律过速怎么办st-t改变