码迷,mamicode.com
首页 > 其他好文 > 详细

2014 Super Training #4 D Paint the Grid Again --模拟

时间:2014-07-02 18:28:45      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   2014   

原题:ZOJ 3780 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780

刚开始看到还以为是搜索题,没思路就跳过了。结果后来发现就是一个简单的模拟啊,因为每行每列都只能消去一次,直接慢慢消去就好了,因为按字典序从小到大,那就按行从大到小,列从大到小的顺序来消就可以了,消完了标记一下,把那行或者那列的元素都赋为一个特殊的字符‘*‘即可。

还是应该多思考啊,不要被题目吓到了。探寻题目的本质才能更好的解题。

代码:

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
#define N 14

pair<char,int> ans[250020];
char ss[506][506];
int Rvis[506],Cvis[506];

int main()
{
    int t,n,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%s",ss[i]);
        memset(Rvis,0,sizeof(Rvis));
        memset(Cvis,0,sizeof(Cvis));
        int flag = 0;
        int o,x,h;
        int k = 0;
        while(!flag)
        {
            flag = 1;
            //行X
            for(i=n-1;i>=0;i--)
            {
                if(Rvis[i])
                    continue;
                o = x = h = 0;
                for(j=0;j<n;j++)
                {
                    if(ss[i][j] == X)
                        x++;
                    else if(ss[i][j] == O)
                        break;
                    else
                        h++;
                }
                if(j == n && h != n)  //没有出现O且不全为‘*‘
                {
                    Rvis[i] = 1;
                    ans[k].first = R;
                    ans[k++].second = i+1;
                    for(j=0;j<n;j++)
                        ss[i][j] = *;
                    flag = 0;
                    break;
                }
                else if(h == n)
                    Rvis[i] = 1;
            }
            if(!flag)
                continue;
            //列O
            for(j=n-1;j>=0;j--)
            {
                if(Cvis[j])
                    continue;
                o = x = h = 0;
                for(i=0;i<n;i++)
                {
                    if(ss[i][j] == X)
                        break;
                    else if(ss[i][j] == O)
                        o++;
                    else
                        h++;
                }
                if(i == n && h != n) //没有出现X且不全为‘*‘
                {
                    Cvis[j] = 1;
                    ans[k].first = C;
                    ans[k++].second = j+1;
                    for(i=0;i<n;i++)
                        ss[i][j] = *;
                    flag = 0;
                    break;
                }
                else if(h == n)
                    Cvis[j] = 1;
            }
        }
        int tag = 1;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                if(ss[i][j] != *)
                {
                    tag = 0;
                    break;
                }
        if(!tag)
            puts("No solution");
        else
        {
            printf("%c%d",ans[k-1].first,ans[k-1].second);
            for(i=k-2;i>=0;i--)
                printf(" %c%d",ans[i].first,ans[i].second);
            printf("\n");
        }
    }
    return 0;
}
View Code

 

2014 Super Training #4 D Paint the Grid Again --模拟,布布扣,bubuko.com

2014 Super Training #4 D Paint the Grid Again --模拟

标签:style   blog   http   color   os   2014   

原文地址:http://www.cnblogs.com/whatbeg/p/3819775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!