好水的题阿。。直接模拟就OK了。。不过也有一点麻烦。。一次AC了。。
http://acm.sgu.ru/problem.php?contest=0&problem=463
#include<iostream>
#define REP(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=100+10;
const int di[]={-1,0,1,0},dj[]={0,1,0,-1};
int B[maxn][maxn]={0};
bool pass[maxn][maxn]={0};
int Pass(int x,int y)
{
int ans=B[x][y];
if(pass[x][y]) ans/=2;
pass[x][y]=true;
return ans;
}
int value(int x,int y,int d)
{
int ans=0;
switch(d)
{
case 0:ans=Pass(x-1,y-1)+Pass(x-1,y);break;
case 1:ans=Pass(x-1,y)+Pass(x,y);break;
case 2:ans=Pass(x,y-1)+Pass(x,y);break;
case 3:ans=Pass(x-1,y-1)+Pass(x,y-1);break;
}
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
REP(i,1,n)
REP(j,1,m)
{
char t;cin>>t;
B[i][j]=t-‘0’;
}
int d=1,x=1,y=1,ans=0;
char t;
while(cin>>t)
{
switch(t)
{
case ‘M’:ans+=value(x,y,d);
x+=di[d],y+=dj[d];break;
case ‘L’:d–;if(d<0) d=3;break;
case ‘R’ :d++;if(d>3) d=0;
}
}
cout<<ans<<endl;
}
写在前面。。
好不容易快搞定USACO了。。开始做sgu了。。
做了半天感觉没动力阿。。于是开个博客发题解。。就有动力了。。
本来我亡命是WJMZBMR的。。不知怎么回事注册不了。。只好改成WJBZBMR了感觉差不多。。
sgu 479题解
这是这次比赛中最简单的。。也是我唯一做出的一道。。
题目在http://acm.sgu.ru/problem.php?contest=0&problem=479
很明显最后一个肯定是1。。没1肯定每解。。然后把最后一个拿掉。。那么周围的都要-1。。然后再找倒数第二个就可以了。。注意如果某个数被-成0的话。。肯定也没解。。可以用类似拓扑排序的方式。。
Code。。偷懒效率写得很低。。。
#include<queue>
#include<stack>
#include<iostream>
#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();
}
}