连连看
2016-04-06 23:01
169 查看
基本题意:输入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<
感想:再多做几道就会了,加油吧代码:
#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<