日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1175 连连看

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1175 连连看 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

連連看

Time Limit: 20000/10000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14349????Accepted Submission(s): 3744

Problem Description “連連看”相信很多人都玩過。沒玩過也沒關系,下面我給大家介紹一下游戲規則:在一個棋盤中,放了很多的棋子。如果某兩個相同的棋子,可以通過一條線連起來(這條線不能經過其它棋子),而且線的轉折次數不超過兩次,那么這兩個棋子就可以在棋盤上消去。不好意思,由于我以前沒有玩過連連看,咨詢了同學的意見,連線不能從外面繞過去的,但事實上這是錯的。現在已經釀成大禍,就只能將錯就錯了,連線不能從外圍繞過。 玩家鼠標先后點擊兩塊棋子,試圖將他們消去,然后游戲的后臺判斷這兩個方格能不能消去。現在你的任務就是寫這個后臺程序。

?

Input 輸入數據有多組。每組數據的第一行有兩個正整數n,m(0<n<=1000,0<m<1000),分別表示棋盤的行數與列數。在接下來的n行中,每行有m個非負整數描述棋盤的方格分布。0表示這個位置沒有棋子,正整數表示棋子的類型。接下來的一行是一個正整數q(0<q<50),表示下面有q次詢問。在接下來的q行里,每行有四個正整數x1,y1,x2,y2,表示詢問第x1行y1列的棋子與第x2行y2列的棋子能不能消去。n=0,m=0時,輸入結束。 注意:詢問之間無先后關系,都是針對當前狀態的!

?

Output 每一組輸入數據對應一行輸出。如果能消去則輸出"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 3秒? dfs 8秒?? 2種完全不同的方法 #include<stdio.h> #include<queue> #include<string.h> using namespace std; int n,m,flag,x1,x2,y1,y2; int map[1005][1005]; int vis[1005][1005]; int dir[4][2]={1,0,0,-1,-1,0,0,1}; struct node {int x,y,t; }q1; int bfs() {int i;q1.x=x1,q1.y=y1,q1.t=-1;vis[x1][y1]=1;queue<node>q;q.push(q1);while(!q.empty()){node q2;q2=q.front();q2.t+=1;q.pop();if(q2.t>2)break;for(i=0;i<4;i++){q1.x=q2.x+dir[i][0],q1.y=q2.y+dir[i][1],q1.t=q2.t;while(q1.x>0&&q1.x<=n&&q1.y>0&&q1.y<=m&&!map[q1.x][q1.y]){if(q1.x==x2&&q1.y==y2&&q1.t<=2)return 1;if(!vis[q1.x][q1.y]){q.push(q1);}vis[q1.x][q1.y]=1;q1.x+=dir[i][0];q1.y+=dir[i][1];}}}return 0; } int main() {int i,j,p,temp;while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&map[i][j]);scanf("%d",&p);while(p--){scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if(map[x1][y1]!=map[x2][y2]||!map[x1][y1]||!map[x2][y2]||(x1==x2&&y1==y2)){printf("NO\n");continue;}temp=map[x2][y2];map[x2][y2]=0;memset(vis,0,sizeof(vis));if(bfs())printf("YES\n");elseprintf("NO\n");map[x2][y2]=temp;}}return 0; }

dfs

#include<stdio.h> #include<string.h> int n,m,flag,c,d; int map[1005][1005]; int vis[1005][1005]; int dir[4][2]={{0,-1}, {0,1}, {-1,0}, {1,0}}; void dfs(int px,int py,int cx,int cy,int step) {int i;vis[cx][cy]=1;if(step>2)return;if(flag)return;if(cx==c&&cy==d){flag=1;return;}for(i=0;i<4;i++){int xx=cx+dir[i][0],yy=cy+dir[i][1],num;if(xx>0&&xx<=n&&yy>0&&yy<=m&&!vis[xx][yy]&&!map[xx][yy]){if(px==xx&&xx==cx||py==yy&&yy==cy){num=step;}elsenum=step+1;dfs(cx,cy,xx,yy,num);vis[xx][yy]=0;}}} int main() {int i,j,t,a,b;while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&map[i][j]);scanf("%d",&t);while(t--){scanf("%d %d %d %d",&a,&b,&c,&d);flag=0;if(map[a][b]!=map[c][d]||!map[a][b]||!map[c][d]||(a==c&&b==d)){printf("NO\n");continue;}memset(vis,0,sizeof(vis));int temp=map[c][d];map[c][d]=0;dfs(a,b,a,b,0);if(flag)printf("YES\n");elseprintf("NO\n");map[c][d]=temp;}}return 0; }

?

轉載于:https://www.cnblogs.com/llei1573/p/3254919.html

總結

以上是生活随笔為你收集整理的hdu 1175 连连看的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。