连连看
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12182 Accepted Submission(s): 3183
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
注意:询问之间无先后关系,都是针对当前状态的!
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
YES NO NO NO NO YES
#include<iostream>
using namespace std;
int map[1002][1002];
bool X(int x1,int y1,int y2)
{
int min1,max1;
min1=y1>y2?y2:y1;
max1=y1>y2?y1:y2;
int flag=0;
for(int i=min1+1;i<max1;i++){
flag=0;
if(map[x1][i]!=0){
flag=1;
break;
}
}
if(!flag){
//cout<<"YES"<<endl;
return true;
}
return false;
}
bool Y(int y1,int x1,int x2)
{
int flag=0;
int min1=x1>x2?x2:x1;
int max1=x1>x2?x1:x2;
for(int i=min1+1;i<max1;i++)
{
flag=0;
if(map[i][y1]!=0){
flag=1;
break;
}
}
if(!flag){
// cout<<"YES"<<endl;
return true;
}
return false;
}
int main()
{
int n,m;
while(cin>>n>>m&&(n!=0||m!=0)){
int i,j;
for(i=0;i<1002;i++)
for(j=0;j<1002;j++)
map[i][j]=-1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>map[i][j];
int t;
cin>>t;
while(t--){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if((map[x1][y1]!=map[x2][y2])||(map[x1][y1]==0&&map[x2][y2]==0)){
cout<<"NO"<<endl;
continue;
}
if(x1==x2) //same col
if(X(x1,y1,y2)){
cout<<"YES"<<endl;
continue;
}
if(y1==y2)
if(Y(y1,x1,x2)){
cout<<"YES"<<endl;
continue;
}
int flag=0;
for(i=1;i<=n;i++){ //水平搜索
if((map[i][y1]==0&&map[i][y2]==0)
||(map[i][y1]==map[x1][y1]&&map[i][y2]==0)
||(map[i][y1]==0&&map[i][y2]==map[x2][y2]))
if(X(i,y1,y2)&&Y(y1,x1,i)&&Y(y2,x2,i)){
flag=1;
cout<<"YES"<<endl;
break;
}
}
if(flag)
continue;
flag=0;
for(i=1;i<=m;i++){ //垂直搜索
flag=0;
if((map[x1][i]==0&&map[x2][i]==0)
||(map[x1][i]==map[x1][y1]&&map[x2][i]==0)
||(map[x1][i]==0&&map[x2][i]==map[x2][y2]))
if(Y(i,x1,x2)&&X(x1,y1,i)&&X(x2,y2,i))
{
flag=1;
cout<<"YES"<<endl;
break;
}
}
if(flag)
continue;
else
cout<<"NO"<<endl;
}
}
return 0;
}
BFS搜索;(注:转载)
#include <queue>
#include <cstring>
using namespace std;
{
};
int n, m, map[1002][1002], prove;
int visit[1002][1002][4]; //记录第(i,j)个点4个方向是否已走过,0为未走过。
int qry, sx, sy, ex, ey;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {1, 0, -1, 0};
{
}
{
}
{
}