青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Tim's Programming Space  
Tim's Programming Space
日歷
<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
統計
  • 隨筆 - 20
  • 文章 - 1
  • 評論 - 40
  • 引用 - 0

導航

常用鏈接

留言簿(3)

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

The Alliances

In a fantasy world, there is a large island of a rectangular shape. The sides of the island happen to be exactly R miles and C miles long, and the whole island is divided into a grid of R\times C areas. Some of the areas are uninhabited, and the rest are occupied by villages of fantasy beings: elves, humans, dwarves, and hobbits. Each area contains at most one village. Two villages are considered neighbours if their areas share a side.

Recently, the villages became terrified of the Great Evil. In order to feel safer, each village has decided to form military alliances with some of its neighbours. An alliance always involves two neighbouring villages, and it is a mutual and symmetric agreement.

Depending on the species living in the village, the inhabitants will not feel safe unless a specific configuration of alliances is formed:

  • The elves feel confident, and therefore need exactly one alliance.
  • Human villages require alliances with exactly two neighbours.
    Moreover, leaving two opposite sides of the village exposed is bad for tactical reasons. Therefore the two allied neighbours cannot be located on opposite sides of the village.
  • Dwarves require alliances with exactly three neighbours.
  • Hobbits are extremely scared, and therefore need to have alliances with all four of their neighbours.

In other words, except for humans each village requires a particular number of alliances, but does not care which neighbours will be its allies. For humans there is an additional restriction: the allied neighbours must not be on opposite sides of the village.

The conditions must be fulfilled irrespective of the position of the village on the map. For example, a dwarf village desires three alliances. If it is located on the coast, this means that it must have alliances with all three neighbours. If there is a dwarf village in a corner of the island, its inhabitants will never feel safe.

Task specification

For a given island description, your task is to decide whether it is possible to form alliances so that all inhabitants of the island will feel safe. In case of a positive answer, your task is also to suggest one viable configuration of alliances. In case of multiple solutions, choose an arbitrary one.

Input specification

The first line of the input contains two integers R and C specifying the size of the island. The following R lines encode a description of the island. Each line consists of C space-separated numbers between 0 and 4:

  • 0 means uninhabited area,
  • 1 means an elf village,
  • 2 means a human village,
  • 3 means a dwarf village.
  • 4 means a hobbit village,

(Note that the number in the input always corresponds to the number of desired alliances for that village.)

Constraints

In all test cases assume that 1 \leq R,C \leq 70.

In test cases worth a total of 55 points we have \min(R,C) \leq 10. Out of these, in test cases worth 15 points R\cdot C \leq 20.

Another batch of test cases worth 10 points contains maps with only uninhabited areas and human villages. (This batch is not included in the test cases worth 55 points.)

Output specification

If there is no solution, output a single line with the string "Impossible!" (quotes for clarity). Otherwise, output one valid map of alliances in the following format.

Each area should appear in the output as a matrix of 3 \times 3 characters. If the area is uninhabited, the corresponding section of the output will be filled with . (dot) symbols. If the area has a village there should be a a symbol O (uppercase letter O) in the middle representing the village itself, and there should be symbols X (uppercase letter X) representing a configuration of its allies. The rest of the 3\times 3 matrix should be filled with . (dot) symbols.

For each village type, all possible layouts of alliances are shown in the image below.

Examples

input:

3 4
2 3 2 0
3 4 3 0
2 3 3 1

output:

............
.OXXOXXO....
.X..X..X....
.X..X..X....
.OXXOXXO....
.X..X..X....
.X..X..X....
.OXXOXXOXXO.
............

input:

1 2
2 1

output:

Impossible!


這是 CEOI2010 當場唯一會做的。。。
題目大意是:告訴一個70*70的格子里面每個點的度,每個格子只能往四周的四個格子連邊,邊是雙向的,對于度為2的點所連的兩條邊不能在一條直線上,求出一組方案。
============================
如果沒有對度為2的點連邊的限制的話,就把格子黑白染色,建二分圖,相鄰的點連容量為1的邊,黑點連源,白點連匯,容量都為要求的度。流之即可。
加上對度為2的點連邊的限制,這樣的方法出現的問題在于沒法處理這個問題了。
但我們發現,對于度為2的點的限制可以化為:橫向或者縱向都有且只有一條邊,于是把度為2的點拆成橫的和豎的兩個點就行了。

/*
 * $File: alliances.cpp
 * $Date: Thu Jul 15 11:18:14 2010 +0800
 * $Prob: CEOI 2010 The Alliances
 * $Author: Tim
 * $Addr: 
http://riesky.sk/ceoi2010/problem.php?contest=CEOI%202010%20Day%201&problem=alliances
 
*/

#include 
<cstdio>
#include 
<cstring>
#include 
<cstdlib>

#define MAXL 71
#define MAXN (MAXL * MAXL * 2 + 10)
#define MAXM (MAXN * 4 + MAXN + MAXN) * 2


#define INFINITE 0x3f3f3f3f
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define OP(x) ((((x) - 1) ^ 1) + 1)

#define OP_DIR(x) ((x + 2) & 3)

using namespace std;

const int fx[] = {010-1};
const int fy[] = {10-10};
const int UP    = 3,
          DOWN    
= 1,
          LEFT    
= 2,
          RIGHT 
= 0;


int map[MAXL + 1][MAXL + 1];
int n, m;
void Init()
{
    scanf(
"%d%d"&n, &m);
    
for (int i = 0; i < n; i ++)
        
for (int j = 0; j < m; j ++)
            scanf(
"%d"&map[i][j]);
}

int N = 2, S = 0, T = 1;
int id[MAXL + 1][MAXL + 1][2];
int ID(int x, int y, int flag)
{
    
if (id[x][y][flag])
        
return id[x][y][flag];
    
return id[x][y][flag] = N ++;
}

int edge_id[MAXL + 1][MAXL + 1][4];
int Count = 0;
int begin[MAXN + 1], end[MAXM + 1], next[MAXM + 1], c[MAXM + 1];
void AddEdge(int a, int b, int f)
{
    Count 
++;
    next[Count] 
= begin[a];
    begin[a] 
= Count;
    end[Count] 
= b;
    c[Count] 
= f;

    Count 
++;
    next[Count] 
= begin[b];
    begin[b] 
= Count;
    end[Count] 
= a;
    c[Count] 
= 0;
}

int tot_flow[2];
void BuildGraph()
{
        
for (int i = 0; i < n; i ++)
        
for (int j = 0; j < m; j ++)
            
if (map[i][j])
            {
                
if ((i + j) & 1)
                {
                    
for (int k = 0; k < 4; k ++)
                    {
                        
int x = i + fx[k], y = j + fy[k];
                        
if (x >= 0 && x < n && y >= 0 && y < m && map[x][y])
                        {
                            AddEdge(ID(i, j, (map[i][j] 
== 2 ? (k & 1) : 0)), 
                                    ID(x, y, (map[x][y] 
== 2 ? (k & 1) : 0)),
                                    
1);
                            edge_id[i][j][k] 
= edge_id[x][y][OP_DIR(k)] = Count;
                        }
                    }
                    
if (map[i][j] == 2)
                    {
                        AddEdge(S, ID(i, j, 
0), 1);
                        AddEdge(S, ID(i, j, 
1), 1);
                    }
                    
else
                        AddEdge(S, ID(i, j, 
0), map[i][j]);
                }
                
else
                {
                    
if (map[i][j] == 2)
                    {
                        AddEdge(ID(i, j, 
0), T, 1);
                        AddEdge(ID(i, j, 
1), T, 1);
                    }
                    
else
                        AddEdge(ID(i, j, 
0), T, map[i][j]);
                }
                tot_flow[(i 
+ j) & 1+= map[i][j];
            }
}
int cur[MAXN + 1], d[MAXN + 1], pre[MAXN + 1], a[MAXN + 1], cnt[MAXN + 1];
int sap()
{
    
int flow = 0, now, tmp, u;
    a[u 
= S] = INFINITE;
    cnt[
0= N;
    memcpy(cur, begin, 
sizeof(begin[0]) * N);
    
while (d[S] < N)
    {
        
for (now = cur[u]; now; now = next[now])
            
if (c[now] && d[u] == d[end[now]] + 1)
                
break;
        
if (now)
        {
            tmp 
= end[now];
            pre[tmp] 
= cur[u] = now;
            a[tmp] 
= MIN(a[u], c[now]);
            
if ((u = tmp) == T)
            {
                flow 
+= (tmp = a[T]);
                
do
                {
                    c[pre[u]] 
-= tmp;
                    c[OP(pre[u])] 
+= tmp;
                    u 
= end[OP(pre[u])];
                }
                
while (u != S);
                a[S] 
= INFINITE;
            }
        }
        
else
        {
            
if ((--cnt[d[u]]) == 0)
                
break;
            cur[u] 
= begin[u], d[u] = N;
            
for (now = begin[u]; now; now = next[now])
                
if (c[now] && d[u] > d[end[now]] + 1)
                    d[u] 
= d[end[now]] + 1, cur[u] = now;
            cnt[d[u]] 
++;
            
if (u != S)
                u 
= end[OP(pre[u])];
        }
    }
    
return flow;
}

bool ans;
void Solve()
{
    BuildGraph();
    ans 
= true;
    
if (tot_flow[0!= tot_flow[1])
        ans 
= false;
    
else if (sap() != tot_flow[0])
        ans 
= false;
}

void Print()
{
    
if (!ans)
        puts(
"Impossible!");
    
else
    {
        
for (int i = 0; i < n; i ++)
        {
            
for (int j = 0; j < m; j ++)
            {
                printf(
"%c"'.');
                printf(
"%c", c[edge_id[i][j][UP]] ? 'X' : '.');
                printf(
"%c"'.');
            }
            printf(
"\n");
            
for (int j = 0; j < m; j ++)
            {
                printf(
"%c", c[edge_id[i][j][LEFT]] ? 'X' : '.');
                printf(
"%c", map[i][j] ? 'O' : '.');
                printf(
"%c", c[edge_id[i][j][RIGHT]] ? 'X' : '.');
            }
            printf(
"\n");
            
for (int j = 0; j < m; j ++)
            {
                printf(
"%c"'.');
                printf(
"%c", c[edge_id[i][j][DOWN]] ? 'X' : '.');
                printf(
"%c"'.');
            }
            printf(
"\n");
        }
    }
}

int main()
{
    freopen(
"alliances.in""r", stdin);
    freopen(
"alliances.out""w", stdout);
    Init();
    Solve();
    Print();
    
return 0;
}

posted on 2010-07-15 11:19 TimTopCoder 閱讀(1869) 評論(1)  編輯 收藏 引用
評論:
 
Copyright © TimTopCoder Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美精品一区| 在线视频日本亚洲性| 欧美在线影院| 亚洲在线视频观看| 久久久久久久波多野高潮日日| 久久精品五月| 久久久久国产精品一区二区| 黄色亚洲网站| 亚洲电影免费观看高清| 在线观看亚洲一区| 欧美不卡一区| 蜜桃久久av一区| 一本色道久久综合亚洲二区三区| 亚洲性色视频| 亚洲欧美www| 欧美视频在线看| 久久激情五月婷婷| 麻豆国产精品va在线观看不卡 | 久久免费一区| 免费欧美网站| 欧美一级网站| 亚洲图片欧洲图片av| 国产字幕视频一区二区| 欧美激情在线有限公司| 国产精品自拍网站| 午夜精品久久久久久| 亚洲欧洲综合另类在线| 国产精品视频导航| 欧美激情第3页| 国产精品免费观看在线| 欧美国产日韩精品免费观看| 国产欧美日韩视频一区二区| 亚洲国产欧美一区| 亚洲图片在区色| 亚洲高清一区二区三区| 午夜亚洲福利在线老司机| 亚洲精品免费电影| 欧美伊人久久大香线蕉综合69| 国产精品mv在线观看| 麻豆免费精品视频| 免费不卡在线观看av| 欧美一区国产二区| 欧美日本高清视频| 亚洲国产成人一区| 亚洲国产天堂网精品网站| 亚洲男女自偷自拍| 亚洲欧美精品suv| 欧美一区二区免费| 国内精品久久久久久久影视蜜臀| 久久成人免费| 国产精品久久一区主播| 久久国产欧美精品| 欧美日韩在线免费观看| 亚洲第一中文字幕| 亚洲国产成人午夜在线一区| 欧美在线视频全部完| 久久久91精品国产一区二区精品| 欧美一级大片在线观看| 亚洲免费在线视频| 久久精品在线| 亚洲精品影院| 老司机精品导航| 欧美激情亚洲一区| 亚洲精品国产精品国自产观看浪潮| 亚洲精品综合| 国产人成精品一区二区三| 这里只有精品视频在线| 亚洲综合色在线| 国产精品国产a级| 亚洲欧美成人在线| 久久精品夜色噜噜亚洲aⅴ| 韩国女主播一区二区三区| 久久噜噜亚洲综合| 欧美不卡视频一区发布| 99在线观看免费视频精品观看| 亚洲在线1234| 久久久高清一区二区三区| 一区二区三区在线免费播放| 免费91麻豆精品国产自产在线观看| 亚洲欧美影院| 国产亚洲欧美日韩美女| 快播亚洲色图| 91久久精品日日躁夜夜躁国产| 国产色爱av资源综合区| 欧美在线视频一区二区| 日韩亚洲一区二区| 欧美午夜精品久久久久免费视| 欧美一区二区三区电影在线观看| 久久五月天婷婷| 亚洲国产精品久久精品怡红院| 国产精品综合av一区二区国产馆| 91久久久久久| 伊人久久综合97精品| 欧美大秀在线观看| 亚洲一区二区三区免费观看| 美女成人午夜| 新67194成人永久网站| 欧美三级特黄| 久久久人成影片一区二区三区 | 国产一区二区三区精品欧美日韩一区二区三区| 篠田优中文在线播放第一区| 蜜臀av国产精品久久久久| 国产亚洲aⅴaaaaaa毛片| 欧美刺激性大交免费视频| 久久久久91| 一本一本久久a久久精品综合麻豆| 久久先锋资源| 亚洲午夜激情| 亚洲精品日韩在线| 久久视频在线免费观看| 亚洲主播在线观看| 亚洲日本中文字幕| 欧美精品三级日韩久久| 性欧美超级视频| 一本久道久久综合中文字幕| 欧美国产日韩一区二区在线观看| 亚洲电影毛片| 国产伦理一区| 久久精品综合| 午夜免费在线观看精品视频| 亚洲日产国产精品| 欧美电影免费网站| 久久精品中文字幕免费mv| 午夜欧美大尺度福利影院在线看| 国产农村妇女毛片精品久久莱园子 | 国产日韩高清一区二区三区在线| 欧美影院在线| 亚洲色无码播放| 日韩视频精品在线| 欧美韩国日本综合| 免费观看成人www动漫视频| 久久免费国产| 久久久在线视频| 久久人人97超碰国产公开结果| 国产一区激情| 国产一区二区三区久久悠悠色av | 免费在线成人| 久热re这里精品视频在线6| 久久久久久久久久久成人| 亚洲欧洲另类| 亚洲电影在线| 亚洲精品乱码久久久久久黑人 | 久久一综合视频| 久久精品亚洲精品| 久久久www成人免费无遮挡大片 | 久久这里只精品最新地址| 先锋影音一区二区三区| 亚洲欧美在线看| 欧美伊人久久久久久久久影院| 亚洲国产成人在线播放| 91久久国产综合久久91精品网站| 欧美日韩一区在线视频| 欧美午夜在线一二页| 久久一区二区三区av| 久久在线91| 欧美国产一区二区三区激情无套| 亚洲欧美日韩国产一区二区三区| 欧美成人69av| 性一交一乱一区二区洋洋av| 欧美中文在线观看| 亚洲视频综合| 午夜精品一区二区三区四区| 久久国产精品色婷婷| 久久综合久久综合九色| 亚洲成人自拍视频| 久久久久久穴| 欧美国产在线观看| 中文网丁香综合网| 久久久久成人网| 欧美日韩视频| 国产视频欧美视频| 日韩午夜av电影| 亚洲欧美日韩在线一区| 制服丝袜亚洲播放| 欧美一区二区视频在线| 欧美国产日本韩| 亚洲影视在线| 欧美激情女人20p| 国产视频在线观看一区二区| 亚洲美女视频| 久久久国产精品一区二区三区| 翔田千里一区二区| 亚洲国产精品毛片| 亚洲欧美日韩另类| 欧美精品激情在线观看| 国内精品99| 亚洲新中文字幕| 亚洲大片精品永久免费| 欧美在线亚洲综合一区| 国产精品久久久久av免费| 亚洲精品看片| 欧美sm极限捆绑bd| 午夜欧美精品| 欧美在线1区| 欧美视频在线观看一区| 亚洲精品一区二区三区在线观看| 亚洲欧洲精品一区| 一本久道综合久久精品| 麻豆精品传媒视频| 欧美亚洲免费在线|