喜歡做這種和遊戲有關的題目 覺得像打遊戲一樣有趣
題目鏈接http://acm.acmcoder.com/showproblem.php?pid=1175
#include <iostream>
#include <cstdio>
using namespace std;
int map[1005][1005];
int main()
{
int m,n;
bool flag1,flag2,flag3;
freopen("in.txt","r",stdin);
scanf("%d%d",&m,&n);
while(m!=0&&n!=0)
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
int c;
scanf("%d",&c);
for(int i=0;i<c;i++)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
bool ans = 0;
if(map[x1][y1]!=map[x2][y2]||map[x1][y1]==0||map[x2][y2]==0) //兩次點擊的圖案不同或者圖案爲空白則不能被消去
{
ans=0;
printf("NO\n");
continue;
}
int minx,maxx;
if(x1>x2)
{
maxx=x1;
minx=x2;
}
else{
minx=x1;
maxx=x2;
}
int miny,maxy;
if(y1>y2)
{
maxy=y1;
miny=y2;
}
else{
miny=y1;
maxy=y2;
}
if(x1==x2) //只需要連一條線的情況
{
ans=1;
for(int j=miny+1;j<maxy;j++)
{
if(map[x1][j]!=0)
{
ans=0;
break;
}
}
if(ans==1)
{
printf("YES\n");
continue;
}
}
if(y1==y2)
{
ans=1;
for(int j=minx+1;j<maxx;j++)
{
if(map[j][y1]!=0)
{
ans=0;
break;
}
}
if(ans==1)
{
printf("YES\n");
continue;
}
}
int ex;
if(x1>x2)
{
ex=x1;
x1=x2;
x2=ex;
ex=y1;
y1=y2;
y2=ex;
}
for(int i=1;i<=m;i++)//豎橫豎三條連線的情況 flag1是橫線 flag2 flag3分別是兩條豎線
{
flag1 = 1;
for(int j=miny+1;j<maxy;j++)// 畫橫線
{
if(map[i][j]!=0)
{
flag1=0;
break;
}
}
if(flag1==1) //存在橫線的時候才考慮豎線
{
flag2=1;
//畫x1y1到達橫線的豎線
if(i>x1)//因爲橫線可能在兩點之上 中間 或者兩點之下 所以豎線的起始終止座標要分情況討論
{
for(int j=x1+1;j<=i;j++)
if(map[j][y1]!=0)
{
flag2=0;
break;
}
}
else //i==x1的這種情況也包括在內 也就是兩條線的情況
{
for(int j=i;j<x1;j++)
if(map[j][y1]!=0)
{
flag2=0;
break;
}
}
flag3=1;
//畫x2y2到橫線的豎線
if(i>x2)
{
for(int j=x2+1;j<=i;j++)
{
if(map[j][y2]!=0)
{
flag3=0;
break;
}
}
}
else
{
for(int j=i;j<x2;j++)
{
if(map[j][y2]!=0)
{
flag3=0;
break;
}
}
}
if(flag2==1&&flag3==1)//三條線同時存在纔可以消去
{
ans=1;
break;//只要找到這樣的連線就確定可以消去
}
}
}
if(ans==1)
{
// printf("heng---%d%d%d",flag1,flag2,flag3);
printf("YES\n");
continue;
}
if(y1>y2)
{
ex=x1;
x1=x2;
x2=ex;
ex=y1;
y1=y2;
y2=ex;
}
for(int i=1;i<=n;i++) //橫豎橫的情況
{
flag1 = 1;
for(int j=minx;j<=maxx;j++)//畫豎線
{
if(map[j][i]!=0)
{
flag1=0;
break;
}
}
if(flag1==1)
{
flag2=1;
if(i>y1)//橫線1
{
for(int j=y1+1;j<=i;j++)
if(map[x1][j]!=0)
{
flag2=0;
break;
}
}
else
{
for(int j=i;j<y1;j++)
if(map[x1][j]!=0)
{
flag2=0;
break;
}
}
flag3=1;
if(i>y2)//橫線2
{
for(int j=y2+1;j<=i;j++)
{
if(map[x2][j]!=0)
{
flag3=0;
break;
}
}
}
else
{
for(int j=i;j<y2;j++)
{
if(map[x2][j]!=0)
{
flag3=0;
break;
}
}
}
if(flag2==1&&flag3==1)
{
ans=1;
break;
}
}
}
// printf("shu---%d%d%d",flag1,flag2,flag3);
if(ans==1) printf("YES\n");
else printf("NO\n");//所有情況都不可能才輸出no
}
scanf("%d%d",&m,&n);
}
return 0;
}