一二三四五 上山打老虎

CCF-CSP-2015-12-2消除类游戏

链接:http://118.190.20.162/view.page?gpid=T36

注意事项:纵向遍历时注意;
思路:
思路1:把有能够消除的坐标进行加入map标记,这样横纵消除互不影响;
思路2:把能够消除的坐标值标为负数,这样横纵不影响对比,输出也方便判断。
代码:

#include<bits/stdc++.h>

using namespace std;
map<pair<int,int>,int>mp;
int a[50][50];
int main (){
    int n,m;
    cin>>n>>m;
    int atm=-1,ans=0;
    for(int i=0;i<n;i++){
        atm=-1;ans=0;
        for(int j=0;j<m;j++){
            cin>>a[i][j];
            if(a[i][j]==atm){
                ans++;
                if(ans==3){
                 mp[make_pair(i,j-1)]=1;
                    mp[make_pair(i,j-2)]=1;
                    mp[make_pair(i,j)]=1;
                }
                else if(ans>3)mp[make_pair(i,j)]=1;
            }
            else {
                atm=a[i][j];
                ans=1;
            }
        }
    }
    for(int i=0;i<m;i++){
        atm=-1;ans=0;
        for(int j=0;j<n;j++){
            if(a[j][i]==atm){
                ans++;
                if(ans==3){
                    mp[make_pair(j,i)]=1;
                    mp[make_pair(j-1,i)]=1;
                    mp[make_pair(j-2,i)]=1;
                }
                else if(ans>3){
                    mp[make_pair(j,i)]=1;
                }
            }
            else {
                atm=a[j][i];
                ans=1;
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[make_pair(i,j)])cout<<0<<" ";
            else cout<<a[i][j]<<" ";
        }
    cout<<endl;
}
    return 0;
}
posted @ 2021-04-03 11:01  黒川川  阅读(56)  评论(0)    收藏  举报