HDU 1175連視(BFS帯方向の判定)
16683 ワード
しきりに見る
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23172 Accepted Submission(s): 5710
Problem Description
「連見」は多くの人が遊んだことがあると信じています.遊んだことがなくても大丈夫です.次はゲームのルールを紹介します.碁盤の中に、たくさんの駒が置いてあります.もしある2つの同じ駒が、1本の線でつながっていて(この線は他の駒を通ることができません)、しかも線の転換回数が2回を超えなければ、この2つの駒は碁盤の上で消すことができます.申し訳ありませんが、私は以前游んだことがないので、友达の意見を聞いて、外から迂回することはできませんが、実はこれは間違っています.今はすでに大きな災いになって、間違いを間違えるしかなくて、線は外周から迂回することができません.
プレイヤーのマウスは前後して2つの駒をクリックして、彼らを消そうとして、それからゲームのバックグラウンドはこの2つの格子が消せるかどうかを判断します.今あなたの任務はこのバックグラウンドプログラムを書くことです.
Input
入力データは複数組あります.各グループのデータの第1行には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
問題解決の考え方:
方向性のあるbfs問題は、前回のネット試合が終わってから、私がこの問題を解決する能力に欠けていることに気づいたので、私はもっと多くの時間をかけてこの方面の練習をしなければなりません.
コード:
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23172 Accepted Submission(s): 5710
Problem Description
「連見」は多くの人が遊んだことがあると信じています.遊んだことがなくても大丈夫です.次はゲームのルールを紹介します.碁盤の中に、たくさんの駒が置いてあります.もしある2つの同じ駒が、1本の線でつながっていて(この線は他の駒を通ることができません)、しかも線の転換回数が2回を超えなければ、この2つの駒は碁盤の上で消すことができます.申し訳ありませんが、私は以前游んだことがないので、友达の意見を聞いて、外から迂回することはできませんが、実はこれは間違っています.今はすでに大きな災いになって、間違いを間違えるしかなくて、線は外周から迂回することができません.
プレイヤーのマウスは前後して2つの駒をクリックして、彼らを消そうとして、それからゲームのバックグラウンドはこの2つの格子が消せるかどうかを判断します.今あなたの任務はこのバックグラウンドプログラムを書くことです.
Input
入力データは複数組あります.各グループのデータの第1行には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
問題解決の考え方:
方向性のあるbfs問題は、前回のネット試合が終わってから、私がこの問題を解決する能力に欠けていることに気づいたので、私はもっと多くの時間をかけてこの方面の練習をしなければなりません.
コード:
1 # include<cstdio>
2 # include<iostream>
3 # include<cstring>
4 # include<queue>
5
6 using namespace std;
7
8 # define MAX 1234
9
10 struct node
11 {
12 int x,y;
13 int direction;
14 int turn;
15 };
16
17 int flag;
18 int x11,x22,y11,y22;
19 int book[MAX][MAX][4];
20 int grid[MAX][MAX];
21 int nxt[4][2] = {{0,1},{-1,0},{0,-1},{1,0} };
22
23 int n,m;
24 queue<node>Q;
25
26 int can_move ( int x,int y )
27 {
28 if ( x>=1&&x<=n&&y>=1&&y<=m )
29 return 1;
30 else
31 return 0;
32 }
33
34 void init()
35 {
36 while ( !Q.empty() )
37 {
38 Q.pop();
39 }
40 memset(book,0,sizeof(book));
41 }
42
43 void bfs ( node start )
44 {
45 init();
46 Q.push(start);
47 while ( !Q.empty() )
48 {
49 node now = Q.front();
50 Q.pop();
51 if ( now.turn > 2 )
52 continue;
53 if ( now.x==x22&&now.y==y22 )
54 {
55 flag = 1;
56 return;
57 }
58
59 for ( int i = 0;i < 4;i++ )
60 {
61 int tx = now.x+nxt[i][0], ty = now.y+nxt[i][1];
62 if ( can_move(tx,ty)==0||book[now.x][now.y][i]==1 )
63 continue;
64 node newnode;
65 newnode.x = tx; newnode.y = ty;
66 if ( (tx==x22&&ty==y22)||grid[tx][ty]==0 )
67 {
68 if ( now.direction == -1||now.direction==i )
69 {
70 newnode.direction = i;
71 newnode.turn = now.turn;
72 }
73 else
74 {
75 newnode.direction = i;
76 newnode.turn = now.turn+1;
77 }
78 book[now.x][now.y][i] = 1;
79 Q.push(newnode);
80 }
81 }
82 }
83 }
84
85
86
87
88 int main(void)
89 {
90 while ( scanf("%d%d",&n,&m)!=EOF )
91 {
92 if ( n==0&&m==0 )
93 break;
94 for ( int i = 1;i <= n;i++ )
95 {
96 for ( int j = 1;j <= m;j++ )
97 {
98 scanf("%d",&grid[i][j]);
99 }
100 }
101
102 int q;scanf("%d",&q);
103 while ( q-- )
104 {
105 flag = 0;
106 scanf("%d%d%d%d",&x11,&y11,&x22,&y22);
107 node start;
108 start.x = x11; start.y = y11; start.turn = 0;start.direction = -1;
109 if ( (grid[x11][y11]==grid[x22][y22])&&grid[x11][y11]!=0 )
110 bfs(start);
111 if ( flag )
112 printf("YES
");
113 else
114 printf("NO
");
115 }
116 }
117
118 return 0;
119 }