mu

mu

浙大的1002

#include<iostream>
using namespace std;
//1002:火网问题

int main()
{
    int n,i=1,i1,j,k,t,j1,k1,j2,k2,mark1=1,mark2=1,num;int mum[4][4];
 while(cin>>n)
 {
  if(n==0)
   break;//遇到0停止
  char a[4][4];char b[4][4];char c[4][4];
  for(j=0;j<n;j++)
   for(k=0;k<n;k++)
   {
    cin>>a[j][k];
   }//输入地图的形状“x”代表墙“.”代表街道
   for(j1=0;j1<n;j1++)
    for(k1=0;k1<n;k1++)
     b[j1][k1]=a[j1][k1];//复制一份地图;
    for(j1=0;j1<n;j1++)
     for(k1=0;k1<n;k1++)
      c[j1][k1]=a[j1][k1];//保存一份地图
     for(j1=0;j1<n;j1++)
      for(k1=0;k1<n;k1++)
      {//cout<<'c';
       if(b[j1][k1]=='.')//找到街道
       {//cout<<'c';
        for(j2=0;j2<n;j2++)
         for(k2=0;k2<n;k2++)
          a[j2][k2]=c[j2][k2];//复制原地图
         a[j1][k1]='1';//赋值为城堡用“1”表示
         for(j=0;j<n;j++)
          for(k=0;k<n;k++)
          {
           if(a[j][k]=='.')
           {
              for(t=0;t<n;t++)
              {
               if(a[j][t]=='1')
               {
               if(t<k)
                mark1=0;//遇到西面有城堡就不能再造
                else
                {
                 mark1=0;
                    break;
                }//遇到东面有城堡就肯定不能再造
             }
               else
                if(a[j][t]=='x')
                {
                 if(t<k)
                mark1=1;//西面是墙,可以造城堡
                 else
                  break;//东面是墙,就看西面情况
                }
              }//东西向判断是否可以建立城堡,
              for(t=0;t<n;t++)
              {
                if(a[t][k]=='1')
             {
                 if(t<j)
                  mark2=0;//北面有城堡不能再建
              else
              {
               mark2=0;
               break;
              }//南面有城堡肯定不能建城堡
              }
             else
              if(a[t][k]=='x')
              {
               if(t<j)
                mark2=1;//北面遇墙可建城堡
               else
                break;//南面遇墙看北面情况
              }
              }//南北向判断是否可以建立城堡
              if(mark1==1&&mark2==1)
              {
               a[j][k]='1';
               i++;
              }
           }//在地图建尽可能多的城堡
           mark1=1;mark2=1;//找完后赋回初值,进入下一轮造城
           /*cout<<a[j][k];
           if(k==3)cout<<endl;
           if(j==3&&k==3)cout<<endl;*/
          }
       }
       mum[j1][k1]=i;//记录可造城堡数
       if(b[j1][k1]=='x')
        mum[j1][k1]=0;//如果遇到墙就不能在墙上造城堡
       //cout<<mum[j1][k1]<<"  ";
       i=1;//赋初值进入下一个情况
      } 
      num=0;
      for(i1=0;i1<n;i1++)
       for(j=0;j<n;j++)
        if(num<mum[i1][j])
         num=mum[i1][j];
        cout<<num<<endl;//找到最大的建城数并输出
 }
 return 0;//返回整型数
}


/*在一张地图上建立最多的城堡‘1’:地图有n行n列的方格构成(n小于5)
上面有街道‘.’和墙‘x’,街道上可以建立城堡,城堡是有攻击性的它能
攻击东西南北,如果城堡之间可以互相攻击,那么城堡就会毁坏,只有墙能
抵抗城堡的攻击。
输入:输入地图的形状,用int n表示地图的行列数,街道用“.”表示,墙用“x”
表示,输入0表示结束;
输出:输出该张地图可建城堡的最大数;

*/
有人能帮我解决下吗?传上去是错误的。

posted on 2008-03-28 12:55 lingcong 阅读(233) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理