UVa11520字典序循环

原创 2018年04月15日 16:46:38

题目链接:点击这里

思路

本题思路比较简单,由于要求字典序最小,因此从第一个位置开始,每次从A开始试错,如果可以满足,则进行下一位。

代码

我使用了int类型进行存储,事实证明比标准AC麻烦了。虽然很多时候字符串要转换为int类型便于处理,但这里不需要,直接把每行当成一个字符串就够了。

类似于AC标准答案,我们可以定义一个template类型,使得任意类型都可进行类似字典比较。

个人代码:

#include <iostream>
#include <string.h>

using namespace std;

int N;

int alphabets[11][11];

int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; /* up down left right */

/* return 0 means OK, else indicats the dirction */
int check(int row, int col)
{
    for (int i = 0; i < 4; i++)
    {
        int n_row = dir[i][0] + row;
        int n_col = dir[i][1] + col;
        // cout << "x: " << row << " y: " << col << endl;
        // cout << "new x: " << n_row << " new y: " << n_col << endl;
        /* if bounded */
        if (n_row >= 1 && n_row <= N && n_col >= 1 && n_col <= N)
        {
            if (alphabets[n_row][n_col] == alphabets[row][col])
                return i + 1;
        }
    }
    return 0;
}

void init()
{
    for (int i = 0; i <= N; i++)
    {
        for (int j = 0; j <= N; j++)
            alphabets[i][j] = -1;
    }
    return;
}

void read_data()
{
    cin >> N;
    init();
    char temp;
    int i = 1, j = 1;
    while (i <= N)
    {
        if (j > N)
        {
            j = 1;
            i++;
        }
        else
        {
            cin >> temp;
            if (temp != '.')
                alphabets[i][j] = (int)(temp - 'A');
            j++;
        }
    }
}

void print()
{
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            char temp = 'A' + alphabets[i][j];
            cout << temp;
        }
        cout << endl;
    }
}

int procss(int row, int col)
{
    int flag = 0;
    if (row > N)
        return 1;
    /* if the char has been setted */
    if (alphabets[row][col] != -1)
        flag = 1;

    /* find the least alphabets */
    for (int i = 0; i < 26; i++)
    {
        if (flag)
            break;

        alphabets[row][col] = i;

        if (check(row, col) == 0)
            break;
    }
    /* look for next position */
    if (col == N)
        procss(row + 1, 1);
    else
        procss(row, col + 1);
}

int main()
{
    int kcase, number = 1;
    cin >> kcase;
    while (kcase--)
    {
        read_data();
        procss(1, 1);
        cout << "Case " << number++ << ":" << endl;
        print();
    }
    return 0;
}

欢迎关注我的个人博客

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/crazy_scott/article/details/79950656

由后缀数组构造字典序最小的原串

由后缀数组构造原串
  • hdu2014
  • hdu2014
  • 2015-12-15 21:20:03
  • 423

组合数学_999按6个算法839647521

  • 2009年04月07日 14:56
  • 15KB
  • 下载

UVa11520

Problem: Fill the Square Description: 有一个矩阵,当中的元素是大写字母,但是有个前提,相邻的位置大写字母不能相同,现在这个矩阵中的某些位置已近有字母了,要你把这...
  • FlushHip
  • FlushHip
  • 2016-06-14 18:38:03
  • 235

uva11520(贪心)

题意: 有一个n*n的方阵,填充大写字母,有一个要求就是每一个位置和上下左右都不能一样,输入一个方阵,'.'的位置要你填充的,要求字典序最小; 思路: 挺水的一道题; 从第一个位置开始...
  • yeyeyeguoguo
  • yeyeyeguoguo
  • 2015-01-29 13:01:38
  • 420

uva11520

题目大意: 填充.的位置,使得与它上下左右的都不一样,而且填充完的字符串连起来要在字典序中最小。思路: 直接暴力枚举出26个字母可以填入哪个,因为是从A-Z所以肯定可以保证其在字典序中最小。(从左...
  • vv494049661
  • vv494049661
  • 2016-01-23 15:28:53
  • 227

贪心算法——字典序最小问题

贪心算法——字典序最小问题   问题主题:字典序最小 问题描述: 给定长度为N的字符串S,要构造一个长度为N字符串T。T是一个空串,反复执行下列任意操作: l 从S的头部删除...
  • luoweifu
  • luoweifu
  • 2014-01-19 15:22:33
  • 8880

bzoj1031(后缀数组)

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4697  Solved: 1923 [S...
  • M_AXSSI
  • M_AXSSI
  • 2015-12-20 10:04:08
  • 525

组合数学全排列字典序法

  • 2010年04月22日 14:00
  • 2KB
  • 下载

全排列(递归和字典序)

递归法: #include #define maxn 100 int d[maxn]; void swap(int *a, int *b) //交换 { int t; t = *a; *a...
  • simatongming
  • simatongming
  • 2015-12-16 04:03:39
  • 1944
收藏助手
不良信息举报
您举报文章:UVa11520字典序循环
举报原因:
原因补充:

(最多只允许输入30个字)