本题链接:点击打开链接
排列2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8127 Accepted Submission(s): 3017
现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。
每组输出数据间空一行,最后一组数据后面没有空行。
PS:真的不想吐槽这个题,格式真的真的真的是恶心至极!!!!PE10多次,不想多说了。
解题思路:
首先,注意格式!大家可以参考我的格式(行末无空格,末尾无空行):
1 2 3 4
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
1 1 2 3
1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211
0 1 2 3
1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210
0 0 0 0
Press any key to continue...(说明一下,用CB编译器最后应该会默认空一行这是没问题的)
然后,在输入四个数之后利用sort函数排下序,听说好像这个题不用考虑排序,测试数据都是从小到大排的,但多一步排序步骤总是没错的,不过需要提醒大家的是要注意排序始末位置,再就是除了第一组测试数据不输出空行外都要先输出一个空行,再进行深搜,回溯,毕竟有多组输出数据。用一个 last 来记录上一个数的第一位是什么,等找到下一个符合题意的数再判断是需要空格还是换行。
代码:
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int a[6];
- bool vis[6];
- int b[6];
- int last,t;
- void dfs(int x)
- {
- if(x==4)
- {
- if(b[0]==0) //第一位不能为0
- return;
- if(b[0]==last&&t!=0) //判断这次输出的数第一位是否与上一次相同,相同就输出空格
- printf(" ");
- if(t!=0&&b[0]!=last) //这次输出的数第一位是否与上一次不同就输出空行
- printf("\n");
- last=b[0]; //记录输出数的第一位
- for(int i=0;i<4;i++)
- printf("%d",b[i]);
- t++; //表示已输出第一组数,接下的数将要进行处理
- }
- for(int i=0;i<4;i++)
- {
- if(vis[i])
- {
- vis[i]=false;
- b[x]=a[i];
- dfs(x+1);
- vis[i]=true; //回溯
- while(a[i]==a[i+1]) //去重
- i++;
- }
- }
- }
- int main()
- {
- bool f=false;
- while(~scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3])&&(a[0]+a[1]+a[2]+a[3]))
- {
- sort(a,a+4); //排序,还是考虑下吧
- memset(vis,true,sizeof(vis));
- if(f)
- printf("\n"); //每组测试数据之后
- f=true;
- t=0; //保证第一组符合题意的数直接输出 (并且可以初始化每个案例的last)
- dfs(0);
- printf("\n");
- }
- return 0;
- }
1993

被折叠的 条评论
为什么被折叠?



