[编程题]删数
有一个数组a[N]顺序存放0-N,要求没隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
输入描述:
每组数据为一行一个整数n(小于等于1000),为数组成员数,如100,则对a[999]进行计算。
输出描述:
一行输出最后一个被删掉的数的原始下标位置。
输入例子:
8
输出例子:
6
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
queue<int>Q;
for(int i=0;i<n;i++)
{
Q.push(i);
}
int cnt=0,tmp;
while(!Q.empty())
{
++cnt;
tmp=Q.front();
Q.pop();
if(cnt==3){cnt=0;}
else
{
if(Q.empty()) break;
Q.push(tmp);
}
}
printf("%d\n",tmp);
}
return 0;
}
[编程题]字符集合
输入一个字符串,求出该字符串包含的字符集合
输入描述:
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
输出描述:
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
输入例子:
abcqweracb
输出例子:
abcqwer
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
char ch[105];
char num[55];
while(scanf("%s",ch)!=EOF)
{
bool vis[260]={false};
int cnt=0;
for(int i=0;ch[i];i++)
{
if(!vis[ch[i]])
{
vis[ch[i]]=true;
num[cnt++]=ch[i];
}
}
num[cnt]='\0';
for(int i=0;i<cnt;i++)
printf("%c",num[i]);
printf("\n");
}
return 0;
}
[编程题]数独
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
先说下数独的游戏规则:
在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
不过现在牛客的数据没过,管理员还在调试。。。大家可以讨论下。
链接:http://www.nowcoder.com/profile/825348/codeBookDetail?submissionId=1097998
#include<stdio.h>
struct point
{
int x, y;
} p[81];
int num, flag, map[10][10];
int judge(int n, int k)
{
int i, j, x, y;
for(i = 0; i < 9; i++)
{
if(i != p[n].y && map[p[n].x][i] == k)
return 0;
if(i != p[n].x && map[i][p[n].y] == k)
return 0;
}
x = p[n].x / 3 * 3;
y = p[n].y / 3 * 3;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
if(map[x+i][y+j] == k && (i != p[n].x || j != p[n].y))
return 0;
return 1;
}
void dfs(int n)
{
int i;
if(n == num)
{
flag = 1;
return;
}
for(i = 1; i < 10; i++)
{
if(judge(n, i))
{
map[p[n].x][p[n].y] = i;
dfs(n + 1);
if(flag)
return;
map[p[n].x][p[n].y] = 0;
}
}
return;
}
int main()
{
int i, j, t = 0;
char s[2];
while(scanf("%s", s) != -1)
{
num = flag = 0;
if(s[0] == '0')
p[num].x = 0, p[num++].y = 0, map[0][0] = 0;
else
map[0][0] = s[0] - '0';
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
if(i || j)
{
scanf("%s", s);
if(s[0] == '0')
p[num].x = i, p[num++].y = j, map[i][j] = 0;
else
map[i][j] = s[0] - '0';
}
dfs(0);
if(t++)
printf("\n");
for(i = 0; i < 9; i++)
{
for(j = 0; j < 8; j++)
printf("%d ", map[i][j]);
printf("%d\n", map[i][8]);
}
}
return 0;
}