zoukankan      html  css  js  c++  java
  • HDU 2101 A计划

    点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=2102

    AC代码       用到三维数组 ,第二次写的代码,因为memset(s,'*',sizeof(s));这里写错了,WA了无数次;

    // hdu 2102 A ji hua (xiu gai ban)
    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    #define N 15
    struct point
    {
    	int x, y, floor, time;
    } st;
    int m, n, t, flag;
    char s[2][N][N];
    int move[4][2] = {0, -1, 0, 1, -1, 0, 1, 0};
    queue<point>q;
    
    void bfs();
    
    int main()
    {
    	//freopen("1.in", "r", stdin);
    	int tt;
    	scanf("%d", &tt);
    
    	while (tt--)
    	{
    		int i, j;
    		scanf("%d %d %d", &n, &m, &t);
    
    		memset(s,'*',sizeof(s));
    
    		for (i = 0; i < 2; i++)
    		{
    			for (j = 0; j < n; j++)
    			{
    				scanf("%s", s[i][j]);
    			}
    		}
    		flag = 0;
    		st.x = 0;
    		st.y = 0;
    		st.floor = 0;
    		st.time = 0;
    		bfs();
    		if(flag) printf("YES
    ");
    		else printf("NO
    ");
    	}
    }
    
    void bfs()
    {
    	while(!q.empty())
    	{
    		q.pop();
    	}
    
    	q.push(st);
    	while(!q.empty())
    	{
    		point now = q.front();
    		q.pop();
    		//printf("x %d y %d f %d t %d
    ",now.x, now.y, now.floor, now.time);
    		for(int i=0;i<4;i++)
    		{
    			point next = now;
    			int xx = now.x, yy = now.y, f = now.floor;
    			//printf("xx %d yy %d
    ",xx,yy);
    			xx += move[i][0];
    			yy += move[i][1];
    			next.time++;
    
    			if(next.time>t) continue;
    			if(xx<0 || xx>=n || yy<0 || yy>=m)	continue;
    			if(s[f][xx][yy] == '*') continue;
    
    			if (s[f][xx][yy] == 'P')
    			{
    				flag = 1;
    				return;
    			}
    			if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == 'P')
    			{
    				flag = 1;
    				return;
    			}
    
    			if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == '#')
    			{
    				s[0][xx][yy] = '*';
    				s[1][xx][yy] = '*';
    				continue;
    			}
    			if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == '*')
    			{
    				s[0][xx][yy] = '*';
    				s[1][xx][yy] = '*';
    				continue;
    			}
    			if(s[f][xx][yy]=='#' && s[1-f][xx][yy] == '.')
    			{
    				s[f][xx][yy] = '*';
    				s[1-f][xx][yy] = '*';
    				next.floor = 1-f;
    				next.x = xx;
    				next.y = yy;
    			}
    			if(s[f][xx][yy] == '.')
    			{
    				s[f][xx][yy] = '*';
    				next.x = xx;
    				next.y = yy;
    			}
    			q.push(next);
    		}
    	}
    }
    


    第一次写的代码,还是WA,不知原因啊》》》哭

    //hdu 2102 A¼Æ»®
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    struct point
    {
    	int x, y, floor, time;
    } st;
    int m, n, t, flag;
    char s1[15][15], s2[15][15];
    int vis1[15][15], vis2[15][15];
    int move[4][2] = {0, -1, 0, 1, -1, 0, 1, 0};
    queue<point>q;
    void bfs();
    int main()
    {
    	//freopen("1.in", "r", stdin);
    	int tt;
    	cin >> tt;
    
    	while (tt--)
    	{
    		int i, j ;
    		cin >> n >> m >> t;
    		memset(s1,'*',sizeof(s1));
    		memset(s2,'*',sizeof(s2));
    
    		for (i = 0; i < n; i++)
    		{
    			cin >> s1[i];
    		}
    
    		for (i = 0; i < n; i++)
    		{
    			cin >> s2[i];
    		}
    
    		for (i = 0; i < n; i++)
    		{
    			for (j = 0; j < m; j++)
    			{
    				if (s1[i][j] == 'S')
    				{
    					st.x = i;
    					st.y = j;
    					st.floor = 1;
    					st.time = 0;
    					break;
    				}
    
    				if (s2[i][j] == 'S')
    				{
    					st.x = i;
    					st.y = j;
    					st.floor = 2;
    					st.time = 0;
    					break;
    				}
    			}
    		}
    
    		memset(vis1, 0, sizeof(vis1));
    		memset(vis2, 0, sizeof(vis2));
    		flag = 0;
    		bfs();
    
    		if (flag)
    		{
    			printf("YES
    ");
    		}
    		else
    		{
    			printf("NO
    ");
    		}
    	}
    
    	return 0;
    }
    void bfs()
    {
    	while (!q.empty())
    	{
    		q.pop();
    	}
    
    	q.push(st);
    
    	while (!q.empty())
    	{
    		point now = q.front();
    		q.pop();
    
    		//printf("x %d,y %d, f %d, t %d
    ",now.x,now.y,now.floor,now.time);
    		for (int i = 0; i < 4; i++)
    		{
    			int xx = now.x, yy = now.y;
    			xx += move[i][0];
    			yy += move[i][1];
    
    			if (s1[xx][yy] == 'P' && now.floor == 1 && now.time < t)
    			{
    				flag = 1;
    				return;
    			}
    
    			if (s2[xx][yy] == 'P' && now.floor == 2 && now.time < t)
    			{
    				flag = 1;
    				return;
    			}
    
    			if (xx >= 0 && xx < n && yy >= 0 && yy < m && now.time <= t)
    			{
    				point next = now;
    
    				if (now.floor == 1 && !vis1[xx][yy])
    				{
    					if (s1[xx][yy] == '.')
    					{
    						vis1[xx][yy] = 1;
    						next.x = xx;
    						next.y = yy;
    						next.floor = 1;
    						next.time++;
    						q.push(next);
    					}
    					else if (s1[xx][yy] == '#' && s2[xx][yy] != '*' && s2[xx][yy] != '#' && !vis2[xx][yy])
    					{
    						if(s2[xx][yy] == 'P') {flag = 1; return;}
    						else
    						{
    							vis2[xx][yy] = 1;
    							next.x = xx;
    							next.y = yy;
    							next.floor = 2;
    							next.time++;
    							q.push(next);
    						}
    					}
    				}
    
    				else if (now.floor == 2 && !vis2[xx][yy])
    				{
    					if (s2[xx][yy] == '.')
    					{
    						vis2[xx][yy] = 1;
    						next.x = xx;
    						next.y = yy;
    						next.floor = 2;
    						next.time++;
    						q.push(next);
    					}
    					else if (s2[xx][yy] == '#' && s1[xx][yy] != '*' && s1[xx][yy] != '#' && !vis1[xx][yy])
    					{
    						if(s1[xx][yy] == 'P') {flag = 1;return;}
    						else
    						{
    							vis1[xx][yy] = 1;
    							next.x = xx;
    							next.y = yy;
    							next.floor = 1;
    							next.time++;
    							q.push(next);
    						}
    					}
    				}
    				else
    				{
    					continue;
    				}
    			}
    		}
    	}
    }
    


    www.cnblogs.com/tenlee
  • 相关阅读:
    我理解的Node.js
    How to handle the issue of node.js msi to roll back under windows 8
    转:.Net 中AxShockwaveFlash的解析
    鱼哥的C++学习笔记(一)编译方法
    TabControl样式编写
    Cocos2d on VS12 step by step
    C# 控制Windows系统音量
    系统环境换成Win8+Vs2012碰到的问题记录
    Http学习笔记(一)
    WPF ListBox Template解析
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420144.html
Copyright © 2011-2022 走看看