您的位置:首页 > 编程语言

连连看

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<
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程