SGU 479 Funny Feature

1、每个格子的南瓜数是1到5,其中,个数为1的格子必定是自己放上去的。可以采用拓扑排序的思路,先处理个数为1的格子,再将周围的南瓜减一,如果减去后发现个数为0,那么出现矛盾(因为这代表原来为1,而1个南瓜必定是自己放上去的),输出“无结果”,如果有解,则逆序输出格子编号。用栈和队列。

#include<cstdio>

#include<iostream>

#include<stack>
#include<queue>
#include<cstdlib>
#define REP(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=200+10;
const int di[]={-1,0,1,0},dj[]={0,1,0,-1};
int map[maxn][maxn],n,m;
bool mark[maxn][maxn]={0};
struct node{ 
    int x,y;
node(int x,int y):x(x),y(y){}
void show(){ 
   cout<<x<<" "<<y<<endl;
}
};
void Cant(){ 
    cout<<"No solution"<<endl;
    exit(0);
}
int main(){ 
    cin>>n>>m;
queue<node> Q;
stack<node> S;
REP(i,0,n+1)REP(j,0,m+1) map[i][j]=10;
    REP(i,1,n)REP(j,1,m){ 
    cin>>map[i][j];
if(map[i][j]==1)
Q.push(node(i,j));
}
    while(Q.size()){ 
    node cur=Q.front();Q.pop();
S.push(cur);
mark[cur.x][cur.y]=true;
REP(k,0,3){ 
     int t=di[k]+cur.x,u=dj[k]+cur.y;
 if(!mark[t][u]&&map[t][u]!=10){ 
     map[t][u]--;
 if(!map[t][u]) Cant();
 if(map[t][u]==1) Q.push(node(t,u));
 }
}
}
if(S.size()!=n*m) Cant();
while(S.size()){ 
    S.top().show();S.pop();
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值