2014年上海邀请赛 D - Battle ships + A - Fire Net

这两个题都是一个模子里刻出来的。。。代码基本改都不用改

A - Fire Net
题意: 类似于八皇后问题,不过少了斜边的条件。

做法: emmmmm。。。套模板就行

这道题最主要的是怎么构图

做法 :
先求一个没有X的由行到列的矩阵
再求一个没有X的由列到行的矩阵
然后找路径
如果map[i][j] == ‘.’ ;
就把两个矩阵的所对应坐标的值当做2个节点所连成的边就行。
下面是AC代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 +10 ;
#define INF 0x3f3f3f3f
struct node
{
    int v, next;
}a[maxn];
int head[maxn], vis[maxn], line[maxn], c[maxn][maxn], l[maxn][maxn];
int n, m, cnt;
char mpt[maxn][maxn];
void add(int u, int v)
{
    a[cnt].v = v;
    a[cnt].next = head[u];
    head[u] = cnt++;
}
int find(int x)
{     // 算法模板 凶奴力算法什么什么的。。。。
    int i;

    for(i = head[x]; i != -1; i = a[i].next)
    {
        int v = a[i].v;

        if(vis[v] == -1)
        {
            vis[v] = 1;
            if(line[v] == -1 || find(line[v]))
            {
                line[v] = x;
                return 1;
            }
        }
    }
    return 0;
}

int main(){
    while(scanf("%d", &n))
    {  if(n == 0) break ;
        cnt = 0 ;
    memset(head , -1 , sizeof(head)) ;
 for(int i = 0; i < n; i++)
            scanf("%s", mpt[i]);
     int coun = 0 ;

    for(int i = 0 ; i < n ; i++)
    {     coun++ ;
      for(int j = 0 ; j < n ; j++){
        if(mpt[i][j] == 'X') coun++ ;
        else c[i][j] = coun ;
      }
    }
    m = coun ;
    coun = 0 ;
        for(int j = 0 ; j < n ; j++)
    {     coun++ ;
      for(int i = 0 ; i < n ; i++){
        if(mpt[i][j] == 'X') coun++ ;
        else l[i][j] = coun ;
      }
    }


   for(int i = 0 ; i < n ; i++)
    {
      for(int j = 0 ; j < n ; j++){
        if(mpt[i][j] == '.') add(c[i][j] , l[i][j] )  ;
      }
   }
    int ans = 0 ;
    memset(line , -1 , sizeof(line)) ;
      for(int i = 1 ; i <= m ; i++){
        memset(vis , -1 , sizeof(vis)) ;
        if(find(i)) ans++ ;
     }
         cout << ans << endl ;
    }
 return 0 ;
}

D - Battle ships
题意: 和上面的题几乎一模一样 , 就不解释了 ‘#’ 和 ‘o’ 的作用是一样的
下面直接贴代码:

#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 1e6 +10 ;
const int maxm = 1e3 + 10 ;
#define INF 0x3f3f3f3f
struct node
{
    int v, next;
}a[maxn];
int head[maxn], vis[maxn], line[maxn], c[maxm][maxm], l[maxm][maxm];
int n, op, cnt;
char mpt[maxm][maxm];
void add(int u, int v)
{
    a[cnt].v = v;
    a[cnt].next = head[u];
    head[u] = cnt++;
}
int find(int x)
{     // 算法模板 凶奴力算法什么什么的。。。。
    int i;

    for(i = head[x]; i != -1; i = a[i].next)
    {
        int v = a[i].v;

        if(vis[v] == -1)
        {
            vis[v] = 1;
            if(line[v] == -1 || find(line[v]))
            {
                line[v] = x;
                return 1;
            }
        }
    }
    return 0;
}

int main(){
    int t ;
     cin >> t ;
    while(t--)
    {   int m ;
         scanf("%d %d", &n ,&m) ;
        cnt = 0 ;
    memset(head , -1 , sizeof(head)) ;
 for(int i = 0; i < n; i++)
            scanf("%s", mpt[i]);
     int coun = 0 ;

    for(int i = 0 ; i < n ; i++)
    {     coun++ ;
      for(int j = 0 ; j < m ; j++){
        if( mpt[i][j] == '#' ) coun++ ;
        else if(mpt[i][j] == 'o' ) coun = coun ;
        else c[i][j] = coun ;
      }
    }
    op = coun ;
    coun = 0 ;
        for(int j = 0 ; j < n ; j++)
    {     coun++ ;
      for(int i = 0 ; i < m ; i++){
        if( mpt[i][j] == '#') coun++ ;
        else if(mpt[i][j] == 'o' ) coun = coun ;
        else l[i][j] = coun ;
      }
    }


   for(int i = 0 ; i < n ; i++)
    {
      for(int j = 0 ; j < m ; j++){
        if(mpt[i][j] == '*') add(c[i][j] , l[i][j] )  ;
      }
   }
    int ans = 0 ;
    memset(line , -1 , sizeof(line)) ;
      for(int i = 1 ; i <= op ; i++){
        memset(vis , -1 , sizeof(vis)) ;
        if(find(i)) ans++ ;
     }
         cout << ans << endl ;
    }
 return 0 ;
}

猜你喜欢

转载自blog.csdn.net/qq_42894605/article/details/82222509