P1141 01迷宫
2018-06-17 22:37:20来源:未知 阅读 ()
题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:输入的第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出格式:输出包括m行,对于每个询问输出相应答案。
输入输出样例
2 2 01 10 1 1 2 2
4 4
说明
所有格子互相可达。
对于20%的数据,n≤10;
对于40%的数据,n≤50;
对于50%的数据,m≤5;
对于60%的数据,n≤100,m≤100;
对于100%的数据,n≤1000,m≤100000。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 int will=0; 7 struct node 8 { 9 int x,y; 10 int step; 11 int p; 12 }cur; 13 int n,m; 14 int vis[1001][1001]; 15 int a[1001][1001]; 16 int xx[6]={-1,+1,0,0}; 17 int yy[6]={0,0,-1,+1}; 18 int tot[1001]; 19 void BFS(int bgx,int bgy,int cs) 20 { 21 int ans=1; 22 memset(vis,0,sizeof(vis)); 23 vis[bgx][bgy]=cs; 24 cur.x=bgx;cur.y=bgy;cur.step=1;cur.p=a[bgx][bgy]; 25 queue<node>q; 26 q.push(cur); 27 while(q.size()!=0) 28 { 29 node now=q.front(); 30 q.pop(); 31 if(now.p==0)will=1; 32 else will=0; 33 for(int i=0;i<4;i++) 34 { 35 int wx=now.x+xx[i]; 36 int wy=now.y+yy[i]; 37 if(vis[wx][wy]==0&&wx>=1&&wx<=n&&wy>=1&&wy<=n&&a[now.x][now.y]!=a[wx][wy]) 38 { 39 node nxt; 40 vis[wx][wy]=cs; 41 nxt.x=wx;nxt.y=wy;nxt.step=now.step+1;nxt.p=will; 42 ans++; 43 q.push(nxt); 44 } 45 } 46 } 47 tot[cs]=ans; 48 return ; 49 } 50 int main() 51 { 52 string z; 53 scanf("%d%d",&n,&m); 54 for(int i=1;i<=n;i++) 55 for(int j=1;j<=n;j++) 56 a[i][j]=-1; 57 for(int i=1;i<=n;i++) 58 { 59 cin>>z; 60 for(int k=0;k<z.length();k++) 61 a[i][k+1]=z[k]-48; 62 } 63 64 for(int i=1;i<=m;i++) 65 { 66 int x,y; 67 scanf("%d%d",&x,&y); 68 if(vis[x][y]==0) 69 BFS(x,y,i); 70 else 71 tot[i]=tot[vis[x][y]]; 72 } 73 for(int i=1;i<=m;i++) 74 printf("%d\n",tot[i]); 75 return 0; 76 }
1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 bool matrix[1005][1005];//代表矩阵(0/1); 7 int vis[1005][1005];//vis数组中存这个点在第几次搜索中访问过 8 int dx[4]={0,0,1,-1};//行变化量 9 int dy[4]={-1,1,0,0};//列变化量 10 int n,m;//m行n列 11 long int ans[1000000];//第ans[i]为第i次搜索的结果 12 queue <int> qx,qy;//行队列,列队列 13 int x,y; 14 queue <bool>now;//状态队列(当前所处的点是0还是1) 15 void bfs(int turn,int i,int j)//从点(i,j)开始进行第turn次搜索(turn为所给出的第几个数据) 16 { 17 qx.push(i);//初始点入队 18 qy.push(j); 19 vis[i][j]=turn;//这个点在第turn次搜索中访问过 20 now.push(matrix[i][j]);//当前状态入队 21 long int sum=1;//sum为可到达的点数 22 while(!qx.empty())//队非空 23 { 24 for(int w=0;w<4;w++)//四种走法 25 { 26 int a=qx.front()+dx[w]; 27 int b=qy.front()+dy[w]; 28 if(a>=1&&a<=n&&b>=1&&b<=n&&!vis[a][b]&&matrix[a][b]!=now.front())//若满足条件(注:若vsi[a][b]非零则真,本次搜索结果不可能包括曾经到过的点) 29 { 30 qx.push(a); 31 qy.push(b);//点入队 32 now.push(matrix[a][b]);//状态入队 33 sum++;//点数加一 34 vis[a][b]=turn;//该点在第turn次搜索中访问过 35 } 36 } 37 qx.pop(); 38 qy.pop(); 39 now.pop();//出队 40 } 41 ans[turn]=sum;//存储第turn次的结果 42 return ; 43 } 44 int main(int argc, const char * argv[]) 45 { 46 cin>>n>>m; 47 register int i,j;//不用register也不会T 48 char c;; 49 for(i=1;i<=n;i++) 50 { 51 for(j=1;j<=n;j++) 52 { 53 cin>>c; 54 if(c=='1') matrix[i][j]=true;//存矩阵(地图) 55 } 56 } 57 for(i=1;i<=m;i++) 58 { 59 cin>>x>>y; 60 if(!vis[x][y]) bfs(i,x,y);//如果这个点曾经没有到过,就搜一遍 61 else ans[i]=ans[vis[x][y]];//要是曾经到过,就将曾经第几次到的那个答案作为本次答案 62 } 63 for(i=1;i<=m;i++) 64 { 65 cout<<ans[i]<<endl;//输出 66 } 67 return 0; 68 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- P1358 扑克牌 2020-05-06
- 博弈--巴什博弈 2020-04-24
- Z 字形变换 2020-04-14
- [题记-并查集] 合根植物 - 蓝桥杯 2020-04-07
- 无法正确通过算法题目都是哪些原因造成的? 2020-04-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash