zoukankan      html  css  js  c++  java
  • USACO Section 2.1 The Castle

    /*
    ID: lucien23
    PROG: castle
    LANG: C++
    */
    /************************************************************************/
    /* 求图的连通域问题。利用广度扫描                                                       */
    /************************************************************************/
    #include <iostream>
    #include <fstream>
    #include <map>
    #include <vector>
    #include <queue>
    using namespace std;
    
    typedef struct Position
    {
    	int row;
    	int col;
    	Position(){}
    	Position (int r, int c)
    	{
    		row = r;
    		col = c;
    	}
    } Position;
    bool isPrior(Position pos1, char direction1, Position pos2, char direction2);
    int main()
    {
    	ifstream infile("castle.in");
    	ofstream outfile("castle.out");
    	if(!infile || !outfile)
    	{
    		cout << "file operation failure!" << endl;
    		return -1;
    	}
    
    
    	int M, N;
    	infile >> M >> N;
    	int ***walls = new int**[N];
    	for (int i=0; i<N; i++) 
    	{
    		walls[i] = new int*[M];
    		for (int j = 0; j < M; j++)
    		{
    			walls[i][j] = new int[6]();
    			infile >> walls[i][j][0];
    			switch (walls[i][j][0])
    			{
    			case 0:
    				break;
    			case 1:
    				walls[i][j][1] = 1;
    				break;
    			case 2:
    				walls[i][j][2] = 1;
    				break;
    			case 3:
    				walls[i][j][1] = 1;
    				walls[i][j][2] = 1;
    				break;
    			case 4:
    				walls[i][j][3] = 1;
    				break;
    			case 5:
    				walls[i][j][1] = 1;
    				walls[i][j][3] = 1;
    				break;
    			case 6:
    				walls[i][j][2] = 1;
    				walls[i][j][3] = 1;
    				break;			
    			case 7:
    				walls[i][j][1] = 1;
    				walls[i][j][2] = 1;
    				walls[i][j][3] = 1;
    				break;
    			case 8:
    				walls[i][j][4] = 1;
    				break;
    			case 9:
    				walls[i][j][1] = 1;
    				walls[i][j][4] = 1;
    				break;
    			case 10:
    				walls[i][j][2] = 1;
    				walls[i][j][4] = 1;
    				break;
    			case 11:
    				walls[i][j][1] = 1;
    				walls[i][j][2] = 1;
    				walls[i][j][4] = 1;
    				break;
    			case 12:
    				walls[i][j][3] = 1;
    				walls[i][j][4] = 1;
    				break;
    			case 13:
    				walls[i][j][1] = 1;
    				walls[i][j][3] = 1;
    				walls[i][j][4] = 1;
    				break;
    			case 14:
    				walls[i][j][2] = 1;
    				walls[i][j][3] = 1;
    				walls[i][j][4] = 1;
    				break;
    			case 15:
    				walls[i][j][1] = 1;
    				walls[i][j][2] = 1;
    				walls[i][j][3] = 1;
    				walls[i][j][4] = 1;
    				break;
    			default:
    				break;
    			}
    		}
    	}
    
    	vector<int> components;
    	int cnt = 0;
    	for (int i=0; i<N; i++)
    	{
    		for (int j=0; j<M; j++)
    		{
    			if (walls[i][j][5] == 0)
    			{
    				cnt++;
    				components.push_back(0);
    				queue<Position> nodes;
    				nodes.push(Position(i, j));
    				while (!nodes.empty())
    				{
    					Position pos = nodes.front();
    					int m = pos.row;
    					int n = pos.col;
    					int *currentNode = walls[m][n];
    					nodes.pop();
    					if (currentNode[5] != 0)
    						continue;
    					components[cnt-1]++;
    
    					currentNode[5] = cnt;
    					if (currentNode[1] == 0 && walls[m][n-1][5] == 0)
    					{
    						nodes.push(Position(m ,n-1));
    					}
    					if (currentNode[2] == 0 && walls[m-1][n][5] == 0)
    					{
    						nodes.push(Position(m-1, n));
    					}
    					if (currentNode[3] == 0 && walls[m][n+1][5] == 0)
    					{
    						nodes.push(Position(m, n+1));
    					}
    					if (currentNode[4] == 0 && walls[m+1][n][5] == 0)
    					{
    						nodes.push(Position(m+1, n));
    					}
    				}
    			}
    		}
    	}
    
    	int newRoom = 0;
    	Position wallPos;
    	char dirction;
    
    	for (int i=0; i<N; i++)
    	{
    		for (int j=0; j<M; j++)
    		{
    			if (walls[i][j][1] == 1 && j-1>=0 && walls[i][j][5] != walls[i][j-1][5])
    			{
    				int sum = components[walls[i][j][5]-1] + components[walls[i][j-1][5]-1];
    				Position newPos = Position(i, j-1);
    				if (sum > newRoom || (sum == newRoom && isPrior(newPos, 'E', wallPos, dirction)))
    				{
    					newRoom = sum;
    					wallPos = newPos;
    					dirction = 'E';
    				}
    			}
    
    			if (walls[i][j][2] == 1 && i-1>=0 && walls[i][j][5] != walls[i-1][j][5])
    			{
    				int sum = components[walls[i][j][5]-1] + components[walls[i-1][j][5]-1];
    				Position newPos = Position(i, j);
    				if (sum > newRoom || (sum == newRoom && isPrior(newPos, 'N', wallPos, dirction)))
    				{
    					newRoom = sum;
    					wallPos = newPos;
    					dirction = 'N';
    				}
    			}
    
    			if (walls[i][j][3] == 1 && j+1<M && walls[i][j][5] != walls[i][j+1][5])
    			{
    				int sum = components[walls[i][j][5]-1] + components[walls[i][j+1][5]-1];
    				Position newPos = Position(i, j);
    				if (sum > newRoom || (sum == newRoom && isPrior(newPos, 'E', wallPos, dirction)))
    				{
    					newRoom = sum;
    					wallPos = newPos;
    					dirction = 'E';
    				}
    			}
    
    			if (walls[i][j][4] == 1 && i+1<N && walls[i][j][5] != walls[i+1][j][5])
    			{
    				int sum = components[walls[i][j][5]-1] + components[walls[i+1][j][5]-1];
    				Position newPos = Position(i+1, j);
    				if (sum > newRoom || (sum == newRoom && isPrior(newPos, 'N', wallPos, dirction)))
    				{
    					newRoom = sum;
    					wallPos = newPos;
    					dirction = 'N';
    				}
    			}
    		}
    	}
    
    	int maxRoom = components[0];
    	for (int i=1; i<cnt; i++)
    	{
    		if (components[i] > maxRoom)
    			maxRoom = components[i];
    	}
    	outfile << cnt << endl << maxRoom << endl << newRoom << endl 
    			   << wallPos.row+1 << " " << wallPos.col+1 << " " << dirction <<endl;
    
    	return 0;
    }
    
    bool isPrior(Position pos1, char direction1, Position pos2, char direction2)
    {
    	if(pos1.col < pos2.col || (pos1.col == pos2.col && pos1.row > pos2.row)
    		|| (pos1.col == pos2.col && pos1.row == pos2.row && direction1 == 'N' && direction2 == 'E'))
    	{
    		return true;
    	}
    	return false;
    }

  • 相关阅读:
    DES加密
    隐写术-隐藏明文的另类办法
    古典加密方法(三)转轮机
    古典加密方法(二)置换技术
    古典加密方法(一)代换技术
    基于加密算法的攻击类型的通俗解释(转载自知乎)
    指针小结
    幸福是什么?
    Jmeter常用脚本开发之FTP请求
    python自动发邮件总结及实例说明
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6703325.html
Copyright © 2011-2022 走看看