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

Tim's Programming Space  
Tim's Programming Space
日歷
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
統(tǒng)計(jì)
  • 隨筆 - 20
  • 文章 - 1
  • 評(píng)論 - 40
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿(3)

隨筆檔案

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 

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

/*
 * $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) 評(píng)論(1)  編輯 收藏 引用
評(píng)論:

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
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>
            欧美专区亚洲专区| 另类欧美日韩国产在线| 国产女主播在线一区二区| 欧美偷拍一区二区| 欧美性做爰毛片| 国产精品久久久久77777| 欧美天天在线| 国产综合色产在线精品| 亚洲高清一区二区三区| 日韩一级在线观看| 亚洲制服丝袜在线| 久久久久久综合网天天| 亚洲国产欧美一区二区三区同亚洲| 亚洲福利在线观看| 一本色道久久综合狠狠躁篇怎么玩 | 国产日韩欧美一区| 狠狠色丁香婷婷综合| 亚洲激情电影中文字幕| 亚洲一区3d动漫同人无遮挡| 久久99伊人| 亚洲缚视频在线观看| 亚洲视频中文字幕| 噜噜噜噜噜久久久久久91| 欧美日韩中文字幕精品| 在线观看国产日韩| 亚洲欧美日本精品| 欧美不卡视频一区发布| 亚洲一区二区在线视频| 老司机午夜精品视频| 国产精自产拍久久久久久蜜| 亚洲破处大片| 欧美亚洲免费高清在线观看| 亚洲人成网站777色婷婷| 欧美中文在线免费| 欧美视频久久| aⅴ色国产欧美| 欧美激情精品久久久久久蜜臀| 亚洲综合导航| 欧美精品大片| 日韩视频免费观看| 另类激情亚洲| 亚洲欧美日韩另类| 国产精品成人一区二区网站软件| 亚洲精品中文字| 美女任你摸久久| 久久精品国产亚洲a| 欧美午夜片在线观看| 亚洲免费观看| 欧美高清自拍一区| 久久久亚洲精品一区二区三区 | 亚洲免费中文字幕| 欧美视频观看一区| 99国产精品视频免费观看一公开| 欧美xx视频| 玖玖在线精品| 亚洲国产精品视频一区| 久久综合精品国产一区二区三区| 亚洲一本视频| 国产亚洲日本欧美韩国| 久久成人18免费网站| 性欧美在线看片a免费观看| 国产精品视频网| 久久成人精品一区二区三区| 欧美影院午夜播放| 在线观看欧美日韩| 欧美成人亚洲| 欧美成人精品1314www| 亚洲人在线视频| 91久久精品美女高潮| 欧美日韩国产影院| 欧美一区二区视频网站| 久久精品视频在线免费观看| 亚洲欧美综合另类中字| 国产一区日韩欧美| 欧美11—12娇小xxxx| 美女性感视频久久久| 99国产精品99久久久久久| 亚洲美女中出| 国产精品亚洲综合久久| 久久婷婷麻豆| 欧美理论视频| 午夜精品成人在线视频| 久久精品免费观看| 夜夜嗨av一区二区三区中文字幕 | 看欧美日韩国产| av成人黄色| 午夜在线a亚洲v天堂网2018| 狠狠色丁香久久婷婷综合_中| 亚洲高清一区二区三区| 欧美日韩专区在线| 免费91麻豆精品国产自产在线观看| 欧美va亚洲va香蕉在线| 亚洲男人的天堂在线| 久久久噜噜噜久久久| 在线视频一区观看| 欧美亚洲综合久久| 日韩一级免费| 午夜综合激情| 一区二区三区黄色| 久久久久久亚洲精品中文字幕| 亚洲图片欧美日产| 久久伊人免费视频| 亚洲欧美日韩爽爽影院| 免费视频久久| 久久精品人人做人人爽| 欧美电影在线| 久久久最新网址| 国产精品国产馆在线真实露脸| 欧美va天堂在线| 国产欧美日韩一区二区三区在线| 亚洲国产精品一区二区第四页av | 在线日韩电影| 亚洲一区二区毛片| 中文精品一区二区三区| 久久亚洲一区二区| 欧美一级视频一区二区| 欧美日韩国产免费| 亚洲高清免费| 亚洲人成网站精品片在线观看| 欧美专区一区二区三区| 欧美亚洲系列| 国产精品午夜电影| 亚洲视频欧美视频| 日韩一级免费观看| 欧美国产日韩xxxxx| 欧美黄色影院| 亚洲国产日韩一区| 免费在线观看日韩欧美| 狠狠久久综合婷婷不卡| 一本一本a久久| 一本到高清视频免费精品| 免费中文日韩| 欧美韩日一区二区三区| 精品动漫一区| 久久先锋影音av| 六十路精品视频| 在线成人亚洲| 老司机一区二区| 另类尿喷潮videofree| 黄页网站一区| 老鸭窝亚洲一区二区三区| 男人的天堂亚洲| 亚洲国产精品综合| 欧美国产日韩亚洲一区| 91久久久在线| 亚洲视频免费看| 国产精品视频一二三| 香蕉久久夜色精品国产使用方法| 欧美伊人精品成人久久综合97| 国产日韩在线视频| 久久精品国产清高在天天线 | 亚洲一区影音先锋| 欧美在线1区| 红桃av永久久久| 模特精品在线| 一区二区三区毛片| 午夜精品福利电影| 狠狠色狠狠色综合系列| 久久久夜精品| 亚洲人成毛片在线播放女女| 亚洲欧美国产77777| 国内揄拍国内精品久久| 另类成人小视频在线| 亚洲日本国产| 久久精品日韩欧美| 亚洲美女区一区| 欧美午夜三级| 久久中文精品| 在线一区二区三区四区| 久久久久久夜精品精品免费| 亚洲精品视频在线播放| 国产欧美一区二区三区沐欲| 久久亚洲精品欧美| 99视频一区| 久久综合色一综合色88| 在线一区亚洲| 狠狠色狠色综合曰曰| 欧美视频在线免费看| 久久久水蜜桃av免费网站| 一区二区成人精品 | 海角社区69精品视频| 欧美精品久久久久久久久久| 午夜亚洲性色福利视频| 亚洲国产精品成人精品| 销魂美女一区二区三区视频在线| 亚洲成人在线免费| 国产精品网站在线| 欧美国产综合| 久久久91精品| 亚洲午夜成aⅴ人片| 亚洲福利在线观看| 久久视频在线视频| 亚洲免费在线视频| 亚洲精品之草原avav久久| 国模一区二区三区| 国产精品免费一区二区三区在线观看 | 国产精品私人影院| 欧美国产日韩在线| 久久久久久久久久久成人| 亚洲欧美三级伦理|