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

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>
            一本色道久久综合亚洲二区三区| 亚洲综合二区| 亚洲中无吗在线| 亚洲一卡二卡三卡四卡五卡| 99在线精品视频| 日韩亚洲国产精品| 欧美国产一区在线| 欧美日韩视频在线一区二区| 欧美日韩在线亚洲一区蜜芽| 国产精品视频成人| 黑人中文字幕一区二区三区| 国产综合精品| 99国产精品久久久久久久久久| 亚洲深夜福利在线| 久久久国产一区二区| 久久伊伊香蕉| 亚洲伦理在线观看| 亚洲免费中文字幕| 欧美二区不卡| 国产精品一区亚洲| 亚洲精华国产欧美| 午夜精品视频在线观看| 久久伊人精品天天| 在线一区二区日韩| 久久一区国产| 欧美四级在线| 韩国一区二区三区在线观看| 亚洲国产小视频在线观看| 亚洲一区二区三区高清不卡| 欧美一区二区三区日韩| 欧美高清视频在线观看| 亚洲精品久久久蜜桃| 久久精品电影| 亚洲激情啪啪| 久久黄色级2电影| 欧美色精品天天在线观看视频| 国产原创一区二区| 宅男在线国产精品| 欧美成年视频| 这里只有精品电影| 欧美成人综合一区| 久久精彩免费视频| 国产精品理论片| 一区二区电影免费观看| 美女任你摸久久| 午夜一区二区三视频在线观看 | 米奇777超碰欧美日韩亚洲| 国产精品美女www爽爽爽视频| 激情成人av在线| 亚洲欧美日韩在线观看a三区| 亚洲大片精品永久免费| 久久精品综合| 国产中文一区二区三区| 亚洲欧美一区二区在线观看| 亚洲精品国产视频| 小黄鸭精品密入口导航| 亚洲电影免费在线| 久久午夜精品| 在线播放中文字幕一区| 久久精品人人做人人爽电影蜜月| 在线亚洲免费| 欧美日韩福利视频| 一本色道久久综合亚洲精品按摩| 亚洲电影av在线| 免费亚洲电影| 一区二区欧美在线观看| 亚洲另类自拍| 国产精品白丝jk黑袜喷水| 亚洲无线一线二线三线区别av| 亚洲欧洲在线观看| 欧美日韩国产综合在线| 亚洲图片你懂的| 一区二区三区四区五区在线| 国产精品久久二区| 欧美综合激情网| 欧美在线免费观看亚洲| 一区免费视频| 亚洲精品国产精品久久清纯直播| 欧美日韩在线免费视频| 午夜精彩视频在线观看不卡| 午夜久久99| 亚洲精品影视在线观看| 亚洲精品美女在线| 亚洲伦理精品| 国产精品www网站| 久久久夜夜夜| 欧美电影免费观看高清| 亚洲一区二三| 久久久噜噜噜久久狠狠50岁| 亚洲精品乱码久久久久久| 99精品国产在热久久| 国产精品日韩久久久| 久久综合中文色婷婷| 欧美激情综合五月色丁香小说| 亚洲婷婷免费| 久久久久九九视频| 一本色道久久88精品综合| 亚洲在线成人| 日韩一级二级三级| 欧美一区二区观看视频| 日韩视频在线一区二区| 性色av一区二区三区| 99国内精品久久| 久久精品国产一区二区三区免费看| 亚洲伦理精品| 久久免费高清视频| 欧美亚洲专区| 欧美日韩午夜精品| 欧美gay视频| 国产亚洲精品久久久久婷婷瑜伽| 亚洲黄色免费| 国内揄拍国内精品久久| 一区二区三区欧美在线| 亚洲人成在线观看网站高清| 亚洲女同同性videoxma| 亚洲综合激情| 亚洲一二三区视频在线观看| 久久综合影视| 久久久久久久久久看片| 欧美日韩精品欧美日韩精品一| 久久一区二区三区四区| 国产精品一区2区| 日韩一区二区免费高清| 亚洲国产高清一区| 久久国产精品99国产精| 午夜欧美电影在线观看| 欧美日韩不卡一区| 最近中文字幕mv在线一区二区三区四区| 国产伦精品一区二区三| 日韩午夜免费| 日韩亚洲精品电影| 欧美va天堂va视频va在线| 欧美波霸影院| 亚洲国产综合视频在线观看| 久久成人羞羞网站| 久久久久久久久综合| 国内精品久久久久影院色| 亚洲欧美美女| 久久精品国产一区二区三区| 国产欧美精品日韩精品| 亚洲午夜视频在线观看| 亚洲欧美亚洲| 国产在线观看一区| 久久精品免费播放| 欧美77777| 亚洲精品日韩精品| 欧美日韩国产高清| 99热精品在线| 亚洲欧美怡红院| 国产亚洲一区二区在线观看| 欧美一区二区三区免费视频| 久久视频在线看| 影音先锋亚洲电影| 理论片一区二区在线| 亚洲狠狠婷婷| 亚洲伊人一本大道中文字幕| 国产精品v片在线观看不卡| 亚洲在线中文字幕| 久久综合久久88| 亚洲精品国产精品乱码不99按摩| 欧美黄免费看| 亚洲欧美日韩天堂| 欧美14一18处毛片| 在线一区二区三区四区五区| 国产精品美女www爽爽爽视频| 欧美一区二区三区电影在线观看| 嫩草国产精品入口| 一区二区欧美国产| 国产日韩一区二区三区在线播放| 久久综合色综合88| aa级大片欧美三级| 久久久久久网站| 一区二区三区产品免费精品久久75| 国产精品美女久久久久aⅴ国产馆| 校园春色国产精品| 亚洲三级免费观看| 久久亚洲精品欧美| 亚洲视频在线观看| 在线视频观看日韩| 国产精品免费一区豆花| 久久婷婷久久一区二区三区| 亚洲精品乱码久久久久久蜜桃91| 久久国产精品久久久久久久久久 | 亚洲尤物影院| 亚洲第一福利社区| 国产精品v亚洲精品v日韩精品| 久久精品视频99| 亚洲一区二区三区四区在线观看 | 亚洲日本va在线观看| 欧美在线国产精品| 99re6这里只有精品视频在线观看| 国产欧美一区二区三区视频| 模特精品在线| 久久久久久一区二区| 中文一区字幕| 亚洲欧洲一区二区三区在线观看| 久久久久一区| 欧美在线资源| 先锋资源久久| 亚洲欧美视频一区二区三区|