连连看

基本题意:输入m行n列矩阵,表示连连看的游戏坐标,再输入t表示输入的次数,接下来每次输入两个点,判断能否在低于两次转折的情况下,满足这两个点能连接,且相等。思路:深度优先,其实我还是不会,感觉太麻烦。而且这一类的题就是麻烦况且我还不会,只好看大神的了。

感想:再多做几道就会了,加油吧代码:

 #include #include

 #include using namespace std;

 #define clr(k,v) memset (k,v,sizeof(k))

 const int _m=1100; int n,m,a ,b,c,d; int g[_m][_m],dir [4][2]={{1,0},{-1,0},{0,1},{0,-1}};

 bool ok,v[_m][_m]; void dfs (int x,int y,int p,int t) { if (x>n||y>m||x<1||y<1||t>2||ok) return; 

if (x==c&&y==d&&t<=2) { ok=true;return ;}

 if (t==2&&x!=c&&y!=d) return ; v[x][y]=1; 

for (int i=0;i<4&&!ok;++i) { int _x=x+dir[i][0];

 int _y=y+dir[i][1]; 

if (_x==c&&_y==d); 

else if (g[_x][_y]||v[_x][_y]) continue; 

if (i==p||p==-1) dfs(_x,_y,i,t); else dfs (_x,_y,i,t+1); v[_x][_y]=0; } } 

int main() { while (cin>>n>>m&&m||n) { for (int i=1;i<=n;i++)

 for (int j=1;j<=m;j++) cin>>g[i][j]; 

int t;cin>>t; while(t--) { cin>>a>>b>>c>>d; 

if (g[a][b]!=g[c][d]||!g[a][b]) { cout<<"NO"<<endl; continue; } 

clr(v,0); ok=false; dfs (a,b,-1,0); if (ok) cout<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值