收录日期:2021/02/25 16:33:47 时间:2016/08/15 19:24:50 标签:C语言
士兵队列 

--------------------------------------------------------------------------------

Time limit: 1000MS    Memory limit: 32768K 
Total Submit: 248    Accepted: 106 


--------------------------------------------------------------------------------

国王刚刚打了一场胜仗,但有很多士兵牺牲了,所以原来的的矩阵队列有很多的空位。因此国王将士兵重新排列,他要求士兵按照原来的列的大小来排列,有空位的要补齐。
补齐的方式如下:

(1) 同一行,前面有空位的后面士兵补齐,如果该行士兵没补满,下面一行的补上。

(2) 递归重复步骤(1)直到士兵之间没有空位。

排好后国王才想到,这样排的话,把原来位置上士兵的战斗值搞混了,然而他又没有备份,如果撤销排队命令的话,又显得没有威信,所以一时有点郁闷了,你能帮他解决这个问题吗?



输入:

有多组测试数据。

原来队列的行列数n,m(1 <= n, m <= 1000)。接着是原来的队列,非0数表示这个位置上士兵的战斗值,0表示这个位置的士兵已经牺牲。然后一个数k,下面k行中每一行包含2个整数x, y (1 <= x <= n, 1 <= y <= m), 表示排列前这个士兵的位置。

 

输出:

对于每个位置,输出重新排列后,该士兵的位置。




Sample Input:

3 3

5 0 3

4 5 0

6 5 0

2

1 1

2 1



Sample Output:

1 1

1 3



我的代码超时了。实在无路可走了。没学过多少算法,请好心人帮忙。
我的代码:
#include<iostream>
#include<cstring>
using namespace std;
struct sold
{
int power;
}sold[1010][1010];
int main()
{
int Row,Line,N,testR,testL;
int i,j,sum,row,line;
while(cin>>Line>>Row)
{
        for(i=1;i<=Line;i++)
{
for(j=1;j<=Row;j++)
{
cin>>sold[i][j].power;
}
}
cin>>N;
while(N--)
{
sum=0;
cin>>testL>>testR;
line=testL;
row=testR;
for(i=1;i<testL;i++)
    for(j=1;j<=Row;j++)
{
if(sold[i][j].power==0)
sum++;
}
while(sum--)
{
row--;
if(row==0)
{
row=Row;
line--;
}
}
for(j=1;j<testR;j++)
{
if(sold[i][j].power==0)
{
row--;
if(row==0)
{
row=Row;
line--;
}
}
}
cout<<line<<" "<<row<<endl;
}
}
return 0;
}
简单的模拟。。按他的要求做就是了。 。
但是一开始没考虑到n<=3的情况导致错了两次。。
下面是AC代码:

#include<iostream>
using namespace std;
int f[5009];
int main()
{
int t;
int n,i;

while(cin>>t)
{
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
f[i]=i;
int t;
if(n<=3)
{
printf("1");
for(i=2;i<=n;i++)
printf(" %d",i);
printf("\n");
continue;
}
while(1)
{
int leap=0;
for(i=1;i<=n;i++)
{
if(f[i]!=-1)
{
leap++;
}
if(leap==2)
{
leap=0;
f[i]=-1;
}
}
t=0;
for(i=1;i<=n;i++)
if(f[i]!=-1)
t++;

if(t<=3)
break;

leap=0;
for(i=1;i<=n;i++)
{
if(f[i]!=-1)
leap++;
if(leap==3)
{
f[i]=-1;
leap=0;
}
}
t=0;
for(i=1;i<=n;i++)
if(f[i]!=-1)
t++;
if(t<=3)
break;

}
for(i=1;i<=n;i++)
if(f[i]!=-1)
{
printf("%d",f[i]);
break;
}
i++;
for(;i<=n;i++)
if(f[i]!=-1)
printf(" %d",f[i]);
printf("\n");
}
}

return 0;
}
神呀,要是能写下注释该多好呀.
这个题很有意思啊!!
mark~学习啦~

[大家放松一下吧]我做的城市场景漫游,捧个场吧~~我有上万分,一次只能放100:( dataset列类型的转换? 用sa登录能不能创建出所有者为user1用户的表? 佳人生南国,春来娇又俏 各位老大,我下载的软件老是在安装的时候由于CRC错而失败,咋回事啊? 如何点击一个按钮就出现一个对话框 各位,我想文一个switch的问题~ 斑竹都干什么去了 我没有分了,各位程序员大哥帮帮忙呀~~求打开MDI子窗口的一个过程... (zt)无语了,两个被小孩子戳穿的谎言(倪萍和一个女老师) 网页自动跳转 asp 提交超过64k的数据问题 求助:将Excel中数据导入SQL Server中时遇到的问题 [急!!在线等!!]大家帮我看一下这程序,怎么不能将数据加入到JTable中呀~~ 怎么只显示用户表?? CPU升级 又是100分,还是摄像头捕获照相问题,散了几百分还没有解决.再问,再加分 操作员于用户帐户有无联系? 汇编初级问题? 做外挂/游戏客户端一定要用阻塞模式吗 想学ASP,请前辈们指点一二. ibatis的sqlMap字符集问题 求《JSP+Oracle组建动态网站实例精讲》的代码 jpg文件的合并问题,200元,急! 谁删的,站出来说句话 如何给treeview增加背景(web版) 关于编译出错问题,帮帮忙 弄的没办法了 ASP.net如何操作数据库student,在程序运行中来建立一个新表score? ···大家做GUI开发是有没有发生过这种事?··· 有关西门子NetManager