C-連続して見る

31311 ワード

C-連続して見る
Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit 
Status
Description
「連見」は多くの人が遊んだことがあると信じています.遊んだことがなくても大丈夫です.次はゲームのルールを紹介します.碁盤の中に、たくさんの駒が置いてあります.もしある2つの同じ駒が、1本の線でつながっていて(この線は他の駒を通ることができません)、しかも線の転換回数が2回を超えなければ、この2つの駒は碁盤の上で消すことができます.申し訳ありませんが、私は以前游んだことがないので、友达の意見を聞いて、外から迂回することはできませんが、実はこれは間違っています.今はすでに大きな災いになって、間違いを間違えるしかなくて、線は外周から迂回することができません. 
プレイヤーのマウスは前後して2つの駒をクリックして、彼らを消そうとして、それからゲームのバックグラウンドはこの2つの格子が消せるかどうかを判断します.今あなたの任務はこのバックグラウンドプログラムを書くことです. 
 
Input
入力データは複数組あります.各グループのデータの最初の行には2つの正の整数nがあり、m(0注意:問い合わせの間に前後関係がなく、現在の状態に対応しています!
 
Output
各入力データのセットは、1行の出力に対応します.消去できる場合は「YES」、できない場合は「NO」を出力します. 
 
Sample Input
 
      
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
 

Sample Output

 
      
YES NO NO NO NO YES
这个非常好可以作为dfs的典型,他用到了dfs的简化版,杜觉了dfs的代码的问题,值得借鉴他的他的方法。
他直接进行判断dfs的进入条件,用到了传入一个数字来记录这个代码所走的方向,同时也用到了每次的标记进行与之前的标记进行比较,杜绝了进入许多路径导致在别的路径可以走这个点,但是却被一个不通的路径进行了标记,导致终断,他用到了vis[xx][yy]>vis[x][y]&&ans<2,来避免这种情况。
#include
#include
using namespace std;
const int maxv=1010;
const int inf=0xfffff;
int n,m;
int sx,sy,ex,ey;
int g[maxv][maxv];
int vis[maxv][maxv];
bool flag;
int fang[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int ans,int f)
{
	if(x==ex&&y==ey)
	{
		flag=1;
	    return;
	}
	for(int i=0;i<4&&flag==0;i++)
	{
		int xx=x+fang[i][0],yy=y+fang[i][1];
		if(xx>=1&&xx<=n&&yy<=m&&yy>=1&&(g[xx][yy]==0||(xx==ex&&yy==ey)))
		{
			if(i==f||f==-1)
			{
				vis[xx][yy]=ans;
				dfs(xx,yy,ans,i);
				if(flag==1)
				return ;
			}
			else
			if(ans<2&&vis[xx][yy]>vis[x][y])
			{
				vis[xx][yy]=ans+1;
				dfs(xx,yy,ans+1,i);
				if(flag)return;
			}
		}
		
	}
}
int main()
{
     while(scanf("%d%d",&n,&m)!=EOF)
     {
     	if(n==0&&m==0)
     	break;
     	for(int i=1;i<=n;i++)
     	{
     		for(int j=1;j<=m;j++)
     		scanf("%d",&g[i][j]);
		 }
		 int p;
		 scanf("%d",&p);
		 while(p--)
		 {flag=0;
		 	scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
		 	if(g[sx][sy]!=g[ex][ey])
		 	printf("NO
"); else if(g[sx][sy]==0) printf("NO
"); else { fill(&vis[0][0],&vis[maxv][0],inf); vis[sx][sy]=0; dfs(sx,sy,0,-1); if(flag) printf("YES
"); else printf("NO
"); } } } }